《Verilog,VHDL经典简明教程》由会员分享,可在线阅读,更多相关《Verilog,VHDL经典简明教程(44页珍藏版)》请在金锄头文库上搜索。
1、清华大学微电子学研究所 张春Verilog for RTL Coding2024/8/121/44清华大学微电子学研究所 张春内容提要内容提要n面向综合的Verilog语法子集n面向测试的Verilog语法子集2024/8/122/44清华大学微电子学研究所 张春IEEE HDL StandardsnVHDLIEEE Std 1076-1987IEEE Std 1076-1993IEEE Std 1076-2000 (VHDL-AMS)IEEE Std 1076-2002nVerilogIEEE Std 1364-1987IEEE Std 1364-1995IEEE Std 1364-2000
2、2024/8/123/44清华大学微电子学研究所 张春程序结构程序结构LIBRARY ieee; .ENTITY 实体名实体名 IS PORT (端口表)(端口表)END;ARCHITECTURE 结构体名结构体名 信号定义信号定义BEGIN 功能描述功能描述END;CONFIGURATION 配置名配置名.VHDL/EntityModule Name & Port List数据类型定义数据类型定义wire/reg功能描述功能描述Verilog/module2024/8/124/44清华大学微电子学研究所 张春Verilog代码示例代码示例module test(a,b,c,d,z,sum);
3、input a,b; input3:0 c,d; output z; output3:0 sum;reg 3:0 sum; /端口信号端口信号wire and_out; /内部信号内部信号AND instance1(a,b,and_out);INV instance2(and_out, z);always (c or d)begin sum = c + d;endendmoduleModule Name & Port List数据类型定义数据类型定义wire/reg功能描述功能描述Verilog代码区分大小写代码区分大小写2024/8/125/44清华大学微电子学研究所 张春Module Na
4、me & Port Listn信号方向:信号方向:input,output,inoutn信号类型:信号类型:wire/regmodule test(a,b,c,d,z,sum);input a,b; input3:0 c,d; output z; output3:0 sum;reg 3:0 sum; wire and_out; always (c or d)begin sum = c + d;endendmodule只有只有always/initial过程的输过程的输出才需要定义为出才需要定义为reg端口信号的缺省类型是端口信号的缺省类型是wire,可以省略,可以省略2024/8/126/44
5、清华大学微电子学研究所 张春Verilog的四值逻辑的四值逻辑n0, 1, X, Z2024/8/127/44清华大学微电子学研究所 张春数的表示方式数的表示方式nSize: 以以bit为单位为单位Base: b(二进制二进制),o(八进制八进制),d(十进制十进制),h(16进制进制)Value:和进制相应的数值,和进制相应的数值,x, z, ? (x,z不区分大小写不区分大小写)n例例16/32位十进制数位十进制数8d168h108b0001_001032bx /32位位x2b? ?、z、Z都表示高阻都表示高阻2024/8/128/44清华大学微电子学研究所 张春常用数据类型常用数据类型n
6、wire(线网)(线网)表示元件之间的物理连接表示元件之间的物理连接wire a,b;wire 3:0 address;nreg(寄存器)(寄存器)always/initial过程的输出过程的输出不要和不要和flip-flop(D触发器触发器)混淆混淆reg 1:5 state, newstate;2024/8/129/44清华大学微电子学研究所 张春另一种代码风格另一种代码风格module Pie_decoder0(rst ,clk , pie_data_in_io , pie_data_out_en , pie_data_out_bit ,pie_data_out_bit_en ,pie_
7、TRcal_higher, err); input rst; input clk; input pie_data_in_io; output reg pie_data_out_en; / output enable controller output reg pie_data_out_bit; / serial output output reg pie_data_out_bit_en; / when1,one bit is ready output reg 8:0 pie_TRcal_higher; wire pie_data_in; reg 5:0 pie_tari_higher; reg
8、 7:0 pie_RTcal_higher; reg 3:0 Pie_decoder_State; parameter ST0 = 4b0000, ST1 = 4b0001, ST2 = 4b0010, ST3 = 4b0011, ST4 = 4b0100, ST5 = 4b0101, ST6 = 4b0110, ST7 = 4b0111, ST8 = 4b1000; 2024/8/1210/44清华大学微电子学研究所 张春VHDL电路模块的实现电路模块的实现nVHDL并行赋值语句并行赋值语句 (=)选择并行赋值语句选择并行赋值语句条件并行赋值语句条件并行赋值语句进程进程 (process)变
9、量赋值变量赋值(:=)顺序赋值顺序赋值(=)IF语句语句CASE语句语句元件例化元件例化PORT MAPArchitecture arch of xxx isBegin C = D and E ; with (S1 + S2) select S = A when 0, B when 1 to 5, D when others; Process (.) begin if clkevent and clk 1 then q b_ii, seg=b_seg);End arch;2024/8/1211/44清华大学微电子学研究所 张春VHDL和和Verilog的对比的对比nVHDL并行赋值语句并行赋值
10、语句 (=)选择并行赋值语句选择并行赋值语句条件并行赋值语句条件并行赋值语句进程进程 (process)变量赋值变量赋值(:=)顺序赋值顺序赋值(=)IF语句语句CASE语句语句元件例化元件例化PORT MAPnVerilog连续赋值语句连续赋值语句 (assign)过程过程 (always)阻塞赋值阻塞赋值(=)非阻塞赋值非阻塞赋值(, =, =, =(相等)(相等), !=(不等)(不等)n逻辑操作:逻辑操作:&, |, !, n位操作:位操作: (非)(非), &, |, (异或)(异或), (同或)(同或)n归约操作:归约操作:&, &, |, |, , n移位操作:移位操作:n条件操
11、作:条件操作:?:n连接和复制:连接和复制: , nx, 2024/8/1215/44清华大学微电子学研究所 张春几种操作的比较几种操作的比较n位操作、归约操作和逻辑操作位操作、归约操作和逻辑操作2024/8/1216/44清华大学微电子学研究所 张春几种操作的比较几种操作的比较n算术和关系操作算术和关系操作assign c = a + b ;assign bigger = a b ;assign eq = ( a = b ) ;2024/8/1217/44清华大学微电子学研究所 张春元件例化元件例化nVHDLu1:seg7 port map(b_ii,b_seg);u1:seg7 port
12、map (ii=b_ii, seg=b_seg);nVerilogAND u1(a,b,and_out);AND u1(.a(a), .b(b), .o(and_out);2024/8/1218/44清华大学微电子学研究所 张春过程过程n过程过程 (always)阻塞赋值阻塞赋值(=)非阻塞赋值非阻塞赋值( b ) res = 1; else if ( a c ) begin res = 2; out = 4; end else res = 3;2024/8/1220/44清华大学微电子学研究所 张春case语句语句 define OP_LOAD 2b00 define OP_ADD 2b01
13、 define OP_SUB 2b10 always (op) begin case ( op ) OP_LOAD : out = din; OP_SUB : out = a - b; default : out = a + b; endcaseend2024/8/1221/44清华大学微电子学研究所 张春阻塞赋值和非阻塞赋值阻塞赋值和非阻塞赋值n阻塞赋值阻塞赋值(=)阻塞性过程赋值在其后所有语句执行前执行,即在下一语句执阻塞性过程赋值在其后所有语句执行前执行,即在下一语句执行前该赋值语句完成执行。行前该赋值语句完成执行。n非阻塞性非阻塞性(=)过程赋值中,对目标的赋值是非阻塞的过程赋值中,对
14、目标的赋值是非阻塞的(因为时延因为时延),但可预定,但可预定在将来某个时间步发生在将来某个时间步发生(根据时延;如果是根据时延;如果是0时延,那么在当前时延,那么在当前时间步结束时间步结束)。当非阻塞性过程赋值被执行时,计算右端表达式,右端值被赋当非阻塞性过程赋值被执行时,计算右端表达式,右端值被赋于左端目标,并继续执行下一条语句。于左端目标,并继续执行下一条语句。预定的最早输出将在当前时间步结束时,这种情况发生在赋值预定的最早输出将在当前时间步结束时,这种情况发生在赋值语句中没有时延时。在当前时间步结束或任意输出被调度时,语句中没有时延时。在当前时间步结束或任意输出被调度时,即对左端目标赋值
15、。即对左端目标赋值。n在同一个在同一个always/initial块里不要混用两种赋值语句块里不要混用两种赋值语句2024/8/1222/44清华大学微电子学研究所 张春n在实现组合逻辑电路的在实现组合逻辑电路的always块里用阻塞赋值块里用阻塞赋值类似类似VHDL在在process里对变量赋值里对变量赋值阻塞赋值实现组合逻辑电路阻塞赋值实现组合逻辑电路module test();reg dout;always (a or b or c) if (b) dout = a ; else dout = c ;endmodulealways块的输出块的输出2024/8/1223/44清华大学微电子
16、学研究所 张春阻塞赋值实现组合逻辑电路阻塞赋值实现组合逻辑电路n在实现组合逻辑电路的在实现组合逻辑电路的always块里用阻塞赋值块里用阻塞赋值类似类似VHDL在在process里对变量赋值里对变量赋值always (a or b or x) begin x = a&b ; y = x | b ; x = a ;endalways (a or b or x) begin x = a & b ; y = x | b ; x = a ;end2024/8/1224/44清华大学微电子学研究所 张春always块的敏感表块的敏感表n实现组合逻辑电路的实现组合逻辑电路的always块敏感表必须写全,否
17、则块敏感表必须写全,否则仿真结果和综合结果会不一致仿真结果和综合结果会不一致always (a or b or c) f = a&b|c ;always (a or b) f = a&b|c ;2024/8/1225/44清华大学微电子学研究所 张春避免避免Latch的产生的产生n实现组合逻辑电路的实现组合逻辑电路的always块中块中if和和case语句的分支语句的分支必须写全。必须写全。always (bcd) begin case ( bcd ) 4d0 : out = 3b001; 4d1 : out = 3b010; 4d2 : out = 3b011; endcaseendLatc
18、halways (a or b or gate ) begin if (gate) out = a | b;end2024/8/1226/44清华大学微电子学研究所 张春避免避免Latch的产生的产生always (bcd) begin case ( bcd ) 2b00 : begin out1 = 3b001; out2=2b00; end 2b01 : begin out1 = 3b011; out2=2b10; end 2b10 : out1 = 3b101; 2b11 : begin out1 = 3b111; out2=2b11; end endcaseend没有改变没有改变out
19、2导致产生导致产生Latch2024/8/1227/44清华大学微电子学研究所 张春避免产生避免产生Latch的办法的办法n第一种n第二种next_state = 3b000;case (cur_state) . endcasecase (cur_state) . default: next_state = 3b000; endcase2024/8/1228/44清华大学微电子学研究所 张春触发器触发器nalways块的块的(posedge clk)或或(negedge clk)n赋值语句的输出信号赋值语句的输出信号always (posedge clk) begin out = a&b ;e
20、ndprocess(clk) begin if clkevent and clk=1 then out = a and b ; end if;end process;2024/8/1229/44清华大学微电子学研究所 张春带低电平有效异步复位端的触发器带低电平有效异步复位端的触发器always (posedge clk or negedge reset ) begin if ( !reset ) out = 0; else out = a&b ;endprocess(clk,reset) begin if rst=0 then out = 0; elsif clkevent and clk=1
21、 then out = a and b ; end if;end process;else分支对应了时钟沿分支对应了时钟沿都必须是边沿都必须是边沿2024/8/1230/44清华大学微电子学研究所 张春带同步复位端的触发器带同步复位端的触发器always (posedge clk ) begin if ( !reset ) dout = 0; else dout = din ;endprocess(clk) begin if clkevent and clk=1 then if reset 0 thendout = 0; else dout = din ; end if; end if;end
22、 process;2024/8/1231/44清华大学微电子学研究所 张春非阻塞赋值(非阻塞赋值(=)实现时序电路)实现时序电路n在实现时序电路的在实现时序电路的always块里用非阻塞赋值块里用非阻塞赋值类似类似VHDL在在process里对信号赋值里对信号赋值always (posedge clk) begin x = a ; y = x ; z = y ;endalways (posedge clk) begin x = a ; y = x ; z = y ;end2024/8/1232/44清华大学微电子学研究所 张春更复杂的时序电路更复杂的时序电路-状态机状态机always (pos
23、edge clk or negedge reset ) begin if ( !reset ) out = 0; else 云图描述云图描述end2024/8/1233/44清华大学微电子学研究所 张春VHDL Testbench的结构的结构countercounter.vhdtoptb.vhdprocess=语句rstclk4qWaveform viewerAssert2024/8/1234/44清华大学微电子学研究所 张春Verilog Testbench的结构的结构countercounter.vtoptb.vinitial/alwaysinitialrstclk4qWaveform v
24、iewermonitor/display2024/8/1235/44清华大学微电子学研究所 张春Verilog Testbench的结构的结构timescale 1ns/1psmodule tb; / 信号定义信号定义 / 元件例化元件例化 / 产生激励向量产生激励向量 / 显示输出结果显示输出结果endmodule时间精度时间精度功能仿真:功能仿真:ns门级仿真:门级仿真:ps时间单位时间单位2024/8/1236/44清华大学微电子学研究所 张春Testbench文件(文件(tb.v)timescale 1ns/1nsmodule top;reg clk,rst;wire 3:0dout;
25、counter uut(dout,clk,rst);initial begin clk = 0; forever #10 clk = clk ;endinitial begin rst = 1; #15 rst = 0; #10 rst = 1; #175 $finish;endinitial begin $monitor($time, “%b %b %b“, rst,clk,dout);endendmodule时间精度时间精度时间单位时间单位2024/8/1237/44清华大学微电子学研究所 张春initial和和always的区别的区别ninitial只执行一次,只执行一次,always循
26、环执行循环执行nInitial的用处的用处产生激励向量产生激励向量检查输出波形检查输出波形赋初值赋初值2024/8/1238/44清华大学微电子学研究所 张春用用initial赋初值赋初值reg 3:0 out ;always (negedge rst or posedge clk) beginif ( !rst ) out = 0;elseout = out + 1; end reg 3:0 out ; initial out = 0; always (posedge clk) beginout = out + 1; end2024/8/1239/44清华大学微电子学研究所 张春激励信号的产
27、生激励信号的产生时钟信号:时钟信号: initial begin clk = 0; forever #10 clk = clk ;end 复位信号:复位信号: initial begin rst = 1; #15 rst = 0; #10 rst = 1; #175 $finish;end initial fork rst = 1; #15 rst = 0; #25 rst = 1; #200 $finish;join由时间单位由时间单位和延时决定和延时决定timescale 1ns/1ns时间精度时间精度时间单位时间单位 initial begin rst = 1; rst = #15 0;
28、 rst = #25 1; #200 $finish;end2024/8/1240/44清华大学微电子学研究所 张春检查输出信号检查输出信号timescale 1ns/1nsmodule monitor_test;reg in;wire out;assign #1 out = in;initial begin $monitor($time, out=%b in=%b,out,in);endinitial begin in = 0; #10 in = 1; #10 in = 0;endendmoduletimescale 1ns/1nsmodule monitor_test;reg in;wir
29、e out;assign #1 out = in;initial begin $display($time, out=%b in=%b,out,in);endinitial begin in = 0; #10 in = 1; #10 in = 0;endendmodule2024/8/1241/44清华大学微电子学研究所 张春常见错误常见错误n输入端口只能是net类型的,它可以由上层设计的net或register驱动module mod_a(out,in); output out; input in; reg in; endmodule2024/8/1242/44清华大学微电子学研究所 张春常
30、见错误常见错误n输出端口只可以是net或register类型的,但只能连接到net类型上。module top; reg rega, regb; mod_a U1(rega,regb);endmodulemodule mod_a(out,in); endmodule2024/8/1243/44清华大学微电子学研究所 张春常见错误常见错误ninout端口只可以是net类型的,并且只能连接到net类型。module top; reg data; ramcell U1(data,read);endmodulemodule ramcell(io_port,rd); inout io_port; endmodule2024/8/1244/44