页数:34页文件大小:318.8 KB来源: 硬件描述语言和数字系统设计ppt课件
本课件说明编写测试模块的目的与基本结构,介绍initial块、时钟与复位激励的产生方式、系统任务对波形的观察与打印,并通过完整实例演示测试平台的搭建过程,同时给出常用仿真工具的工程建立与波形查看步骤。
硬件描述语言和数字系统设计
6.2测试的目的6.3测试模块的编写6.4实例6.5仿真工具的使用主要内容
module DFF (d, clk, rst, q, qb); input d,clk,rst; output q,qb; reg q,qb; always @ (posedge clk or negedge rst)if (!rst) beginq<=1’b0; qb<=1’b1; endelse beginq<=d; qb<=~d; endendmodulemoduleREG4( d, clk, clr, q, qb); …endmodule模块例化方法1-位置映射;module DFF (d, clk, rst, q, qb); …….endmodulemoduleREG4( d, clk, clr, q, qb); output [3: 0] q, qb; input [3: 0] d; input clk, clr; DFF d0 (d[0], clk, clr, q[0], qb[0]); DFF d1 (d[1], clk, clr, q[1], qb[1]); DFF d2 (d[2], clk, clr, q[2], qb[2]); DFF d3 (d[3], clk, clr, q[3], qb[3]); endmodule模块实例化方法1:位置映射;module DFF (d, clk, rst, q, qb); ………….Endmodulemodule REG4( d, clk, clr, q, qb); output [3: 0] q, qb; input [3: 0] d; input clk, clr; DFF d0 (.d(d[0]), .clk(clk), .rst(clr), .q(q[0]), .qb(qb[0])); DFF d1 (.d(d[1]), .clk(clk), .rst(clr), .q(q[1]), .qb(qb[1])); DFF d2 (.d(d[2]), .clk(clk), .rst(clr), .q(q[2]), .qb(qb[2])); DFF d3 (.d(d[3]), .clk(clk), .rst(clr), .q(q[3]), .qb(qb[3])); endmodule名称映射的语法:.内部信号(外部信号)模块例化方法2-名称映射:;module comp (o1, o2, i1, i2); output o1, o2; input i1, i2; . . .endmodulemodule test; comp c1(Q, R, J, K);//名称映射comp c3(Q , , J, K);//输入端口i2、输出端口o2没有连接endmodule输出端口没有连接时,通常会产生warning注意事项:没有连接的输入端口初始化值为x。要特别注意可能会引起芯片内电路逻辑出错!!!;在测试模块中常常使用简单延时(#延时)来施加不同数值的激励,或在行为模型中模拟实际延时。module muxtwo (out, a, b, sl); input a, b, sl; output out; reg out; always @( sl or a or b)if (! sl)#10 out = a;//从b到out延时12个时间单位endmodule在简单延时中可以使用模块参数parameter:module tb_clock_gen (clk); output clk; reg clk; parameter CYCLE=20; initial clk = 0; always#(CYCLE/2)clk = ~clk; endmodule6.1.2延时# n语法说明;wire out; assign#1out = in1|in2; 经过1个单位时间延时,右边表达式新结果被赋给左边目标。例如,如果在时刻5,信号in1值发生变化,则在时刻6(5 +1),右端表达式重新运算的结果被赋于左边信号out。延时# n与连续赋值一起使用:;reg out; always@(in1 or in2)out= #1 in1|in2; 经过1个单位时间延时,右边表达式刷新结果被赋给左边目标。例如,如果在时刻5,信号in1值发生变化,则在时刻6(5 +1),右端表达式重新运算的结果被赋于左边信号out。延时# n与过程块内阻塞赋值一起使用:;reg out; always@(posedge clk)out<= #1 in1|in2; 在时钟上升沿后,经过1个单位时间延时,右边表达式的新结果被赋给左边目标。例如,如果在时刻5,信号in1值发生变化,则在时刻6(5 +1),右端表达式重新运算的结果被赋于左边信号out。;测试的目的
测试模块的3要素:
确定值序列产生方法产生确定值序列的最佳方法是使用initial语句。initial内使用阻塞赋值语句外延时,例如:initialbeginReset = 0;#100 Reset = 1;#80 Reset = 0;#30 Reset = 1;end
initial内采用阻塞赋值语句内延时,也能够按如下实例所示产生波形。initialbeginReset = 0;Reset = #100 1;Reset = #80 0;Reset = #30 1;end
initial内采用非阻塞赋值语句:如果使用绝对时延,可用带有语句内时延的非阻塞性过程性赋值,例如,initialbeginReset <= 0;Reset <= #100 1;Reset <= #180 0;Reset <= #210 1;end
如:常用时钟信号的激励产生方法:reg clk_A; parameterCLK_PER= 10; initialclk_A = 0; always#(CLK_PER /2) clk_A = ~ clk_A; 6.3.2重复值序列产生方法-always语句;寄存器变量被综合成触发器或者线的例子电路功能文件proced_reg.v中定义:`timescale 1 ns / 10 psmodule procedure_reg(clk,rst,a,c); input clk,rst,a; output c; regc; reg b; always @(posedge clk or negedge rst)//always @(rst or a)if(!rst) b<=0; else b<=a; always @(posedge clk or negedge rst)//always @(rst or b)if(!rst) c<=1; else c<=b; endmodule;用电路功能文件proced_reg.v中定义过程块敏感量为@(posedge clk ornegedge rst)时的仿真波形:
为@(posedge clk or negedge rst)时的电路图
过程块敏感量为always @(rst or a)/(rst or b)时的仿真波形
(rst or a)/(rst or b)时的电路图
问题1:如果文件proced_reg.v中定义:module procedure_reg(clk,rst,a,c); input clk,rst,a; output c; reg b,c; always @(posedge clk or negedge rst)//always @(rst or a)if(!rst) b<=0; else b<=a;else c<=b; endmodule那么仿真波形又是怎样?电路图又是怎样?;问题1-答案-电路图
问题2:如果文件proced_reg.v中定义:module procedure_reg(clk,rst,a,c); input clk,rst,a; output c; reg b,c;else b<=a; always @(posedge clk or negedge rst)//always @(rst or b)if(!rst) c<=1; else c<=b; endmodule那么仿真波形又是怎样?电路图又是怎样?;问题2-答案-电路图
课后练习常见公司数字IC设计招聘题目(计数器):1.用D触发器做个4进制的计数。(华为)2.实现N位Johnson Counter, N=5。(南山之桥)3.用你熟悉的设计方式设计一个可预置初值的7进制循环计数器,15进制的呢?(仕兰微电子)4.用VERILOG或VHDL写一段代码,实现10进制计数器。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}