No.2 Verilog 模块和描述风格
2-1 模块
Verilog语言基本的描述单元----模块,模块是用来描述某个设计的功能或结构,以及它与其它外部模块进行通信的端口。
1 module module_name(port_list); 2 Declarations: //声明 3 reg, wire, parameter, 4 input, output, inout, 5 function, task,... 6 Statements: //语句 7 Initial statement 8 Always statement 9 Module instantiation 10 Gate instantiation 11 UPD instantiation 12 Continuous assignment 13 Generate statement 14 endmodule
2-2 描述风格
2-2-1 延时
Verilog 的所有延时都是按时间单位来定义的,时间单位声明应该在模块声明之前。
‘timescale 1ns/100ps //延时时间单位1ns,时间精度100ps
2-2-2 描述风格
1、数据流描述----使用连续性赋值语句 assign
assign [delay] DEST = SRC;
*当右边的表达式的操作数无论何时发生变化,右边的表达式都会重新计算,并在指定延时后赋给左边的线网变量。
1 ‘timescale 1ns/100ps 2 module decoder_24(A, B, EN, Q); 3 input A, B, EN; 4 output [0:3] Q; 5 wire Abar, Bbar; 6 assign #1 Abar = ~A; 7 assign #1 Bbar = ~B; 8 assign #2 Q[0] = ~(Abar & Bbar & EN); 9 assign #2 Q[1] = ~(Abar & B & EN); 10 assign #2 Q[2] = ~(A & Bbar & EN); 11 assign #2 Q[3] = ~(A & B & EN); 12 endmodule
2、行为描述----initial、always
(1)initiial: 只执行一次;
(2)always:总是在循环执行。
所有的initial和always语句都在0时刻并行执行。
1 ‘timescale 1ns/100ps 2 3 module adder1(a, b, cin, sum, cout);//一位全加器 4 input a, b, cin; 5 output sum, cout; 6 7 always @(a or b or cin) begin 8 sum <= (a^b)^cin; 9 cout <= ((a&cin)|(b&cin)|(a&b)); 10 end 11 endmodule 12 13 14 module test(lr ,rn); //initial示例 15 output reg lr, rn; 16 initial 17 begin 18 lr = 0; 19 rn = 1; 20 lr = #5 1; 21 rn = #8 0; 22 end 23 endmodule
3、结构描述----基于逻辑门电路的设计风格
1 //一位全加器 2 3 module adder1(a, b, cin, sum, cout); 4 input a, b, cin; 5 output sum, cout; 6 wire s1, t1, t2, t3; 7 xor 8 ux1(s1, a, b), 9 ux2(sum, s1, cin); 10 and 11 tm1(t1, a, b), 12 tm2(t2, a, cin), 13 tm3(t3, b, cin); 14 or 15 uo(cout, t1, t2, t3); 16 endmodule 17 18 //四位全加器 19 20 module Adder4(fa, fb, fcin, fsum, fcout); 21 parameter size = 3; 22 input [size : 0] fa, fb; 23 input fcin; 24 output [size : 0] fsum; 25 output fcout; 26 wire [size - 1 : 0] ftemp; 27 28 adder1 //按对应端口名连接 29 ufa1(.a(fa[0]), .b(fb[0]), .cin(fcin), .sum(fsum[0]), .cout(ftemp[0])), 30 //ufb1(fa[0], fb[0], fcin, fsum[0], ftemp[0]), //按端口顺序连接,下同 31 ufa2(.a(fa[1]), .b(fb[1]), .cin(ftemp[0]), .sum(fsum[1]), .cout(ftemp[1])), 32 ufa3(.a(fa[2]), .b(fb[2]), .cin(ftemp[1]), .sum(fsum[2]), .cout(ftemp[2])), 33 ufa4(.a(fa[3]), .b(fb[3]), .cin(ftemp[2]), .sum(fsum[3]), .cout(fcout)); 34 endmodule
4、混合设计风格
在模块中,可混合使用前面三种设计风格,这样可以帮助我们更高效地进行设计开发,但要注意不同类型语句的语法使用规范。