diff --git a/verilog.md b/verilog.md
new file mode 100644
index 0000000..97d8154
--- /dev/null
+++ b/verilog.md
@@ -0,0 +1,265 @@
+### Verilog
+- Verilog is a Hardware Description Language (HDL).
+- It is a language used for describing a digital system such as a network switch, a microprocessor, a memory, or a flip-flop.
+- We can describe any digital hardware by using HDL at any level.
+- It is great and specific language for programming spartlet kit extensively used by Design engineers from AMD ,Qualcomm and other industries.
+
+#### I) Literals
+```
+<size >'<base><number>
+```
+All of the following are the same:
+
+```
+8'b10101111
+8'hAF
+{4'hA,4'b1111}
+{4'hA,{4{1'b1}}}
+```
+
+#### II) Module declaration.
+
+//Rule: Use separate file for each module (Filename should be
+
+```
+module_name.v):
+module module_name (A, B, C);
+input A; // Inputs to the module
+input [2:0] B; //Convention: one per line
+output C; // Output of the module
+...
+endmodule
+
+```
+#### III) Module instantiation
+
+//In file outer_module.v
+
+```
+module outer_module (in1, in2, out);
+input in1;
+input [2:0] in2;
+output out;
+module_name md (.A(in1), .B(in2), .C(out));
+...
+endmodule
+```
+- Rule: Use port mapping. The port A of module module_name is
+connected to wire in1 in module outer_module.
+#### IV) wire vs reg
+a) Rules for usage within module
+ - LHS of “continuous assign” should be a wire
+ - LHS of “procedural assign” should be reg.
+b) Rules for ports
+ - Ports are by default of type wire (you can override this by declaring
+it as reg)
+ - Input ports cannot be declared as reg (Input ports are always wires)
+ - Output ports can be either reg or wire
+c) Rules for connecting ports while instantiating
+ - When instantiating a module, an output port should be connected to
+a wire (cannot be connected to reg)
+ - When instantiating a module, an input port can be connected to
+either a reg or a wire
+
+#### V) Sequential logic
+ - Rule: To create a flip-flop, instantiate the provided dff.v module.
+ - Rule: Do not code sequential logic in any other way.
+```
+dff d0 (
+.q(flop_out),
+.d(flop_in),
+.rst(reset),
+.clk(clock)
+);
+
+```
+#### VI) Combinational logic
+a) Instantiate the provided logic gates (course webpage)
+b) assign statement (Continuous assign)
+```
+wire result;
+assign result = s ? A : B;
+//result – must always be wire (refer above)
+//s, A, B – can be wire or reg
+```
+c) Procedural assign ( blocking = or non-blocking <=)
+```
+reg result;
+reg err;
+always @(s or A or B)
+begin
+casex(s)
+ 1'b1:
+ begin
+ result = A;
+ err = 1'b0;
+ end
+ 1'b0:
+ begin
+ result = B;
+ err = 1'b0;
+ end
+ default:
+ begin
+ result = 1'bx;
+ err = 1'b1;
+ end
+endcase
+end
+//result, err – must always be reg (refer above).
+
+//s, A, B – can be wire or reg
+```
+
+#### VII) parameter
+- Parameterized module definition (in register.v)
+```
+module register(out, in, wr_en, clk, rst);
+parameter WIDTH = 1;
+output [WIDTH-1:0] out;
+input [WIDTH-1:0] in;
+input wr_en;
+input clk;
+input rst;
+dff_en bits[WIDTH-1:0] (
+ .q(out),
+ .d(in),
+ .en(wr_en),
+ .clk(clk),
+ .rst(rst)
+);//dff_en should instantiate the provided dff.v module
+endmodule
+
+```
+- Instantiating a parameterized module: with default value of the parameter
+register r0 (............);
+- Instantiating a parameterized module: override the default value
+register #(32) r1 (............);
+register #(1) r2 (............);
+#### VIII) Array instantiation
+The dff instantiation in the example above is an array instantiation. It
+instantiates many flops with names bits[0], bits[1], ..... bits[n]. Note how
+the wire 'out' is split across many different instances. Also, the wire
+'wr_en' is connected to multiple ports (one each of each instantiation).
+
+#### IX) define
+- Keep defines in a separate file (modname_config.v):
+```
+define LAST_VALUE 4'b1010
+```
+```
+define WIDTH 4
+```
+- Include the above file in verilog file (modname.v):
+```
+`include "modname_config.v"
+module modname(.........);
+.......
+wire [`WIDTH-1:0] carry;
+assign wire = ~carry & `LAST_VALUE;
+.......
+endmodule
+```
+#### X) Allowed keywords
+assign, module, endmodule, input, output, wire, define, parameter
+
+#### XI) Keywords allowed with stipulations
+case, casex, reg, always, begin, end
+a) case, casex:
+ - Have items for all possible combinations. Use default and err should
+be asserted in default.
+ - All outputs of case statement should be assigned in all case items.
+ - All nets used in RHS of all assigns within case statement and all nets
+used as the compare value in case statement should be specified in the
+sensitivity list.
+b) reg:
+ - Can only be used to specify outputs of case/casex statement.
+c) always, begin, end:
+ - Can only be used to introduce case/casex statement.
+#### XII) Allowed Operators :
+*In list below, shift operators should have the second argument as
+constant. (x<<4 is allowed whereas x<<y is not allowed)
+```
+~m Inversion
+m & n Bitwise AND
+m|n Bitwise OR
+m^n Bitwise XOR
+m~^n Bitwose XNOR
+&m ReductionAND
+~&m Reduction NAND
+|m Reduction OR
+~|m Reduction NOR
+^m Reduction NOR
+~^m Reduction XNOR
+m==n Equality
+m!=n Inequailty
+m===n Identity
+m!==n Not Identical
+m << const Shift left by const bits
+m >> const Shift right by const bits
+condition ? m : n Ternary
+{m, n} concatenation
+{m {n}} replicate n (m times)
+```
+#### XIII) Testing your design
+a) Design file template to be provided for HW2-HW6 and for the project
+(in file foo.v);
+
+```
+module foo (in, out, clk, rst, err);
+...
+endmodule
+```
+b) _hier.v file to be provided for HW2-HW6 and for the project.
+(foo_hier.v):
+```
+module foo_hier ( in, out )
+...
+clkrst c0( .clk(clk), .rst(rst), .err(err) );
+foo f0 ( .out(out), .in(in), .clk(clk),
+ .rst(rst), .err(err) );
+endmodule
+
+```
+c) The testbench _hier_bench.v file to be developed and submitted by the
+student (foo_hier_bench.v)
+```
+module foo_hier_bench;
+foo_hier f0 (....);
+...
+endmodule
+```
+#### XIV) Scripts
+
+a) Verilog rules check script (Not foolproof)
+vcheck-all.sh
+b) Name convention check script:
+name-convention-check
+c) Command line verilog simulation script:
+wsrun.pl foo_hier_bench *.v
+wsrun.pl -wave foo_hier_bench *.v
+d) Synthesis script:
+synth.pl-cmd=synth -type=other -top=foo -opt=yes -
+file=foo.v,foo_submodule1.v,foo_submodule2.v
+XV) Submission rules
+HW2-HW6 and project submissions require absolute compliance with
+guidelines. Here is how you can do almost everything right, but still
+score ZERO:
+ - By tampering with the provided template for foo.v and/or foo_hier.v
+ - By not submitting the provided testbench components foo_hier.v file
+and clkrst.v along with the other verilog files.
+ - By not submitting the other provided modules like dff.v, not1.v,
+nand3.v etc. which are required to compile your design.
+ - By submitting a tar file with a directory structure not matching the
+guidelines.
+(eg, if you have a wrapper directory over hw1_1, hw1_2 and hw1_3)
+(eg, if your verilog files are located within subdirectories inside hw1_1)
+(eg, if you submit hw1_1, hw2_2, hw3_3 when you are asked to submit
+hw1_1, hw1_2 and hw1_3)
+ - By submitting .tar.gz or .zip when you are asked to submit .tar
+ - By not running vcheck on verilog files or by not checking the results
+after running the script.
+ - By not turning in .vcheck.out files for each .v file (except the
+testbench components and provided module.)
+ - By forgetting to click on the 'Submit' button in dropbox after clicking
+the 'Upload' button.