Verilog HDL数字集成电路设计原理与应用课件:仿真验证与Testbench编写.ppt
(1)基于initial语句的方法。
moduleclk1(clk);
outputclk;
parameterclk_period=10;
regclk;
initialbegin
clk=0;
forever#(clk_period/2)clk=~clk;
end
endmodule(2)基于always语句的方法。
moduleclk2(clk);
outputclk;
parameterclk_period=10;
regclk;
initial clk=0;
always#(clk_period/2) clk=~clk;
endmoduleinitial语句用于初始化clk信号,如果没有对clk信号的初始化赋值,会出现对未知信号取反的情况,从而造成clk信号在整个仿真阶段都为未知状态。例5.6-4产生占空比可设置的时钟信号。
自定义占空比信号可以通过always模块快速实现。下面是占空比为20%的时钟信号
代码。
moduleDuty_Cycle(clk);
outputclk;
parameterHigh_time=5,Low_time=20;//占空比为High_time/(High_time+Low_time)
regclk;
alwaysbegin
clk=1;
#High_time;
clk=0;
#Low_time;
end
endmodule这里因为是直接对clk信号赋值,所以不需要initial语句初始化clk信号。
例5.6-5产生具有相位偏移的时钟信号。
相位偏移是两个时钟信号之间的相对概念,如图5.6-3所示。其中clk_a为参考信号,clk_b为具有相位偏移的信号。图5.6-3相位偏移时钟信号示意图产生相移时钟信号的VerilogHDL程序代码如下:
moduleshift_Duty_Cycle(clk_a,clk_b);
outputclk_a,clk_b;
parameterHigh_time=5,Low_time=5,pshift_time=2;
regclk_a;
wireclk_b;
alwaysbegin
clk_a=1;#High_time;
clk_a=0;
#Low_time;
end
assign#pshift_timeclk_b=clk_a;
endmodule
首先通过一个always模块产生参考时钟信号clk_a,然后通过延迟赋值得到clk_b信号,其偏移的相位可通过360*pshift_time%(High_time+Low_time)来计算,其中%为取模运算。上述代码的相位偏移为72°。例5.6-6产生固定数目的时钟信号。
modulefix_num_clk(clk);
outputclk;
parameterclk_cnt=5,clk_period=2;
regclk;
initialbegin
clk=0;repeat(clk_cnt)
#clk_period/2clk=~clk;
end
endmoudle
上述代码产生了5个周期的时钟信号。5.6.4总线信号测试向量的产生
总线是运算部件之间数据流通的公共通道。在RTL级描述中,总线指的是由逻辑单元、寄存器、存储器、电路输入或其它总线驱动的一个共享向量。而总线功能模型则是一种将物理的接口时序操作转化成更高抽象层次接口的总线模型,如图5.6-4所示。
在总线中,对于每个请求端,有一个输入来选择驱动该总线所对应的请求端。选择多个请求端时会产生总线冲突,根据不同的总线类型,会产生不同的冲突结果。当有多个请求端发出请求时,相应的操作由总线的类型决定。在VerilogHDL测试中,总线测试信号通常是通过将片选信号、读(或者写)使能信号、地址信号以及数据信号以task任务的形式来描述,并通过调用task形式的总线信号测试向量来完成相应的总线功能。