## Getting Started
<details>
<summary>
Getting Started
</summary>
```verilog=
module top_module( output one );
//Victor_huang1123
assign one = 1'b1;
endmodule
```
</details>
<details>
<summary>
Output Zero
</summary>
```verilog=
module top_module(
output zero
);// Module body starts after semicolon
endmodule
```
</details>
## Verilog Language
<details>
<summary>
Basics
</summary>
<details>
<summary>
Simple wire
</summary>
```verilog=
module top_module( input in, output out );
assign out=in;
endmodule
```
</details>
<details>
<summary>
Four wires
</summary>
```verilog=
module top_module(
input a,b,c,
output w,x,y,z );
assign w=a;
assign x=b;
assign y=b;
assign z=c;
endmodule
```
</details>
<details>
<summary>
Inverter
</summary>
```verilog=
module top_module( input in, output out );
assign out = !in;
endmodule
```
</details>
<details>
<summary>
AND gate
</summary>
```verilog=
module top_module(
input a,
input b,
output out );
assign out =a& b;endmodule
```
</details>
<details>
<summary>
NOR gate
</summary>
```verilog=
module top_module(
input a,
input b,
output out
);
assign out = ~(a|b);
endmodule
```
</details>
<details>
<summary>
XNOR gate
</summary>
```verilog=
module top_module(
input a,
input b,
output out );
assign out=~(a^b);
endmodule
```
</details>
<details>
<summary>
Declaring wires
</summary>
```verilog=
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire x,y;
assign x=a& b;
assign y=c& d;
assign out=x|y;
assign out_n=~(x|y);
endmodule
```
</details>
<details>
<summary>
7458 chip
</summary>
```verilog=
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire p2ab,p2cd,p1abc,p1def;
assign p2ab=p2a& p2b;
assign p2cd=p2c& p2d;
assign p2y=p2ab|p2cd;
assign p1abc=p1a&p1b& p1c;
assign p1def=p1d&p1e& p1f;
assign p1y=p1abc|p1def;
endmodule
```
</details>
</details>
<details>
<summary>
Vectors
</summary>
<details>
<summary>
Vectors
</summary>
```verilog=
module top_module (
input wire [2:0] vec,
output wire [2:0] outv,
output wire o2,
output wire o1,
output wire o0
);
assign o2 = vec[2];
assign o1 = vec[1];
assign o0 = vec[0];
assign outv = vec[2:0];
endmodule
```
</details>
<details>
<summary>
Vectors in more detail
</summary>
```verilog=
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_hi=in[15:8];
assign out_lo=in[7:0];
endmodule
```
</details>
<details>
<summary>
Vector part select
</summary>
```verilog=
module top_module(
input [31:0] in,
output [31:0] out );//
// assign out[31:24] = ...;
assign out[31:24]=in[7:0];
assign out[23:16]=in[15:8];
assign out[15:8]=in[23:16];
assign out[7:0]=in[31:24];
endmodule
```
</details>
<details>
<summary>
Bitwise operators
</summary>
```verilog=
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise=a|b;
assign out_or_logical=a||b;
assign out_not[5:3]=~b;
assign out_not[2:0]=~a;
endmodule
```
</details>
<details>
<summary>
Four-input gates
</summary>
```verilog=
module top_module(
input [3:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and=in[3]&in[2]&in[1]&in[0];
assign out_or=in[3]|in[2]|in[1]|in[0];
assign out_xor=in[3]^in[2]^in[1]^in[0];
endmodule
```
</details>
<details>
<summary>
Vector concatenation operator
</summary>
```verilog=
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );//
// assign { ... } = { ... };
assign {w,x,y,z}={a,b,c,d,e,f,2'b11};
endmodule
```
</details>
<details>
<summary>
Vector reversal 1
</summary>
```verilog=
module top_module(
input [7:0] in,
output [7:0] out
);
assign out={in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]};
endmodule
```
</details>
<details>
<summary>
Replication operator
</summary>
```verilog=
module top_module (
input [7:0] in,
output [31:0] out
);
// Sign-extend the 8-bit input to 32 bits
assign out = { {24{in[7]}}, in };
endmodule
```
</details>
<details>
<summary>
More replication
</summary>
```verilog=
module top_module (
input a, b, c, d, e,
output [24:0] out );//
// The output is XNOR of two vectors created by
// concatenating and replicating the five inputs.
// assign out = ~{ ... } ^ { ... };
assign out=~{{5{a}},{5{b}},{5{c}},{5{d}},{5{e}}}^{{5{a,b,c,d,e}}};
endmodule
```
</details>
</details>
<details>
<summary>
Modules Hierarchy
</summary>
<details>
<summary>
Modules
</summary>
```verilog=
module top_module ( input a, input b, output out );
mod_a(a,b,out);
endmodule
```
</details>
<details>
<summary>
Connecting ports by position
</summary>
```verilog=
module top_module (
input a,
input b,
input c,
input d,
output out1,
output out2
);
mod_a(out1,out2,a,b,c,d);
endmodule
```
</details>
<details>
<summary>
Connecting ports by name
</summary>
```verilog=
module top_module (
input a,
input b,
input c,
input d,
output out1,
output out2
);
mod_a(.out1(out1),.out2(out2),.in1(a),.in2(b),.in3(c),.in4(d));
endmodule
```
</details>
<details>
<summary>
Three modules
</summary>
```verilog=
module top_module (
input clk,
input d,
output q
);
wire a, b; // Create two wires. I called them a and b.
// Create three instances of my_dff, with three different instance names (d1, d2, and d3).
// Connect ports by position: ( input clk, input d, output q)
my_dff( clk, d, a );
my_dff( clk, a, b );
my_dff( clk, b, q );
endmodule
```
</details>
<details>
<summary>
Modules and vectors
</summary>
```verilog=
module top_module (
input clk,
input [7:0] d,
input [1:0] sel,
output reg [7:0] q
);
wire [7:0] q1, q2, q3;
my_dff8(clk, d, q1);
my_dff8(clk, q1, q2);
my_dff8(clk, q2, q3);
always @(*) begin
case (sel)
2'b00: q = d;
2'b01: q = q1;
2'b10: q = q2;
2'b11: q = q3;
//default: q = 8'b00000000; // Optional default case
endcase
end
endmodule
```
</details>
<details>
<summary>
Adder 1
</summary>
```verilog=
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
//module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
wire c,x;
add16 add1(a[15:0],b[15:0],1'b0,sum[15:0],c);
add16 add2(a[31:16],b[31:16],c,sum[31:16],x);
endmodule
```
</details>
<details>
<summary>
Adder 2
</summary>
```verilog=
module top_module (
input [31:0] a,
input [31:0] b,
output [31:0] sum
);//module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
wire c,x;
add16 add1(a[15:0],b[15:0],1'b0,sum[15:0],c);
add16 add2(a[31:16],b[31:16],c,sum[31:16],x);
endmodule
module add1 ( input a, input b, input cin, output sum, output cout );
assign sum=a^b^cin;
assign cout=(a&b)|(cin&(a^b));
// Full adder module here
endmodule
```
</details>
<details>
<summary>
Carry-select adder
</summary>
```verilog=
module top_module (
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire [15:0] reg1, reg2;
wire c, c1, c2;
// Instantiate add16 modules
add16 add1 (a[15:0], b[15:0], 1'b0, sum[15:0], c);
add16 add2 (a[31:16], b[31:16], 1'b0, reg1, c1);
add16 add3 (a[31:16], b[31:16], 1'b1, reg2, c2);
// Assign upper 16 bits of sum based on carry flags
always @* begin
case(c)
1'b0: sum[31:16] = reg1;
1'b1: sum[31:16] = reg2;
endcase
end
endmodule
```
</details>
<details>
<summary>
Adder-subtractor
</summary>
```verilog=
module top_module(
input [31:0] a,
input [31:0] b,
input sub,
output [31:0] sum
);
wire c,cout;
add16 add1(a[15:0],b[15:0]^{16{sub}},sub,sum[15:0],c);
add16 add2(a[31:16],b[31:16]^{16{sub}},c,sum[31:16],cout);
endmodule
```
</details>
</details>
<details>
<summary> Procedures </summary>
<details>
<summary>
Always blocks(combinational)
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module(
input a,
input b,
output wire out_assign,
output reg out_alwaysblock
);
assign out_assign = a & b;
always @(*) out_alwaysblock = a & b ;
endmodule
```
</details>
<details>
<summary>
Always blocks(clocked)
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module(
input clk,
input a,
input b,
output wire out_assign,
output reg out_always_comb,
output reg out_always_ff );
assign out_assign=a^b;
always@(*) out_always_comb = a^b;
always@(posedge clk)out_always_ff =a^b;
endmodule
```
</details>
<details>
<summary>
If statement
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module(
input a,
input b,
input sel_b1,
input sel_b2,
output wire out_assign,
output reg out_always );
assign out_assign = (sel_b1&&sel_b2)?b:a;
always@(*) out_always =(sel_b1&&sel_b2)?b:a;
endmodule
```
</details>
<details>
<summary>
If statement latches
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module (
input cpu_overheated,
output reg shut_off_computer,
input arrived,
input gas_tank_empty,
output reg keep_driving ); //
always @(*) begin
if (cpu_overheated)
shut_off_computer = 1;
else
shut_off_computer=0;
end
always @(*) begin
if (~arrived)
keep_driving = ~gas_tank_empty;
else keep_driving=0;
end
endmodule
```
</details>
<details>
<summary>
Case statement
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module (
input [2:0] sel,
input [3:0] data0,
input [3:0] data1,
input [3:0] data2,
input [3:0] data3,
input [3:0] data4,
input [3:0] data5,
output reg [3:0] out );//
always@(*) begin // This is a combinational circuit
case(sel)
3'b000:out=data0;
3'b001:out=data1;
3'b010:out=data2;
3'b011:out=data3;
3'b100:out=data4;
3'b101:out=data5;
default: out=3'b000;
endcase
end
endmodule
```
</details>
<details>
<summary>
Priority encoder
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module (
input [3:0] in,
output reg [1:0] pos );
always@(*)
casez(in)
4'b???1:pos=2'b00;
4'b??10:pos=2'b01;
4'b?100:pos=2'b10;
4'b1000:pos=2'b11;
default: pos = 2'b00; // No input is high
endcase
endmodule
```
</details>
<details>
<summary>
Avoiding latches
</summary>
```verilog=
// synthesis verilog_input_version verilog_2001
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up
);
always @(*) begin
// Initialize outputs
left = 1'b0;
down = 1'b0;
right = 1'b0;
up = 1'b0;
// Case statement to assign outputs based on scancode
case (scancode)
16'he06b: left = 1'b1; // Left arrow
16'he072: down = 1'b1; // Down arrow
16'he074: right = 1'b1; // Right arrow
16'he075: up = 1'b1; // Up arrow
endcase
end
endmodule
```
</details>
</details>
<details>
<summary>
More Verilog Features
</summary>
<details>
<summary>
Conditional tenary operator
</summary>
```verilog=
module top_module(
input [7:0] a, b, c, d,
output [7:0] min);//
// assign intermediate_result1 = compare? true: false;
reg[1:0]reg1;
assign reg1[0] = (a < b) ? 1'b1 : 1'b0;
assign reg1[1] = (c < d) ?1'b1:1'b0;
always@(*)
case(reg1)
2'b00:min=(b<d)?b:d;
2'b01:min=(a<d)?a:d;
2'b10:min=(c<b)?c:b;
2'b11:min=(a<c)?a:c;
endcase
endmodule
```
</details>
<details>
<summary>
Reduction operators
</summary>
```verilog=
module top_module (
input [7:0] in,
output parity);
assign parity = ^in;
endmodule
```
</details>
<details>
<summary>
Reduction:Even wider gates
</summary>
```verilog=
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and=& in;
assign out_or=|in;
assign out_xor=^in;
endmodule
```
</details>
<details>
<summary>
Combinational for-loop:Vector reversal 2
</summary>
```verilog=
module top_module(
input [99:0] in,
output [99:0] out
);
genvar i;
generate
for (i = 0; i < 100; i = i + 1) begin:revese
assign out[i] = in[99 - i];
end
endgenerate
endmodule
```
</details>
<details>
<summary>
Combinational for-loop:255-bit population count
</summary>
```
module top_module (
input [254:0] in,
output reg [7:0] out
);
always @* begin
reg [7:0] reg1;
reg1 = 0;
for (int i = 0; i < 255; i = i + 1) begin
reg1 = (in[i] == 1) ? reg1 + 1 : reg1;
end
out = reg1;
end
endmodule
```
</details>
<details>
<summary>
Generate for-loop: 100-bit binary adder 2
</summary>
```verilog=
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
always@(*)begin
for(int i=0;i<100;i++)begin
if(i==0)begin
cout[i]=a[i]&b[i]|a[i]&cin|b[i]&cin;
sum[i]=a[i]^b[i]^cin;
end
else begin
cout[i]=a[i]&b[i]|a[i]&cout[i-1]|b[i]&cout[i-1];
sum[i]=a[i]^b[i]^cout[i-1];
end
end
end
endmodule
```
</details>
<details>
<summary>
Generate for-loop: 100-digit BCD adder
</summary>
```verilog=
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
reg[99:0]reg1;
generate
genvar i;
for(i=0;i<400;i=i+4)begin:bcd
if(i==0)bcd_fadd bf(a[i+3:i],b[i+3:i],cin,reg1[0],sum[i+3:i]);
else bcd_fadd bf(a[i+3:i],b[i+3:i],reg1[i/4-1],reg1[i/4],sum[i+3:i]);
end
endgenerate
assign cout=reg1[99];
endmodule
```
</details>
</details>
### Circuits
<details>
<summary>
Combinational Logic
</summary>
<details>
<summary>
Basic Gates
</summary>
<details>
<summary>
Wire
</summary>
```verilog=
module top_module (
input in,
output out);
assign out=in;
endmodule
```
</details>
<details>
<summary>
GND
</summary>
```verilog=
module top_module (
output out);
assign out=1'b0;
endmodule
```
</details>
<details>
<summary>
</summary>
```verilog=
```
</details>
<details>
<summary>
</summary>
```verilog=
```
</details>
</details>
</details>
# Under construction