Skip to content

Verilog 运算符 RTL 与测试平台小项目

Verilog Operators — RTL & Testbench Mini-Project

  • Verilog HDL_Machine Problem

运算符运算代码如下

image1

仿真结果:

image2

  • 观察波形发现c、d、e的初始值为x不定态

​ 原因:在上文TB中(initial ain= 4‘d0…)只对输入进行了初始化,而并没有对输出值初始化,而输出的初始化一般在例化(RTL)中,后续补充

image3

  • 此外仔细观察以上中间段不定态的波形会发现当上升沿来到时,ain和bin取值为0时,中间a和b的值无论如何变化,其在下一个上升沿到来之前输出值保持不定态,这也佐证了以上RTL代码中提到的

    always @(psedge clk)  //仅上升沿计算c、d、e取值
    		begin c = a/b;
    			  d = a%b;
    		   	  e = a*b;
    		end

总结此次仿真任需解决的问题:

1、输出出现了X不定态

2、想实现在a、b变化的时候c、d、e直接计算出结果


告辞

3.27对于输出出现了X不定态问题的更新:

考虑在RTL中增加复位信号rstn以在时钟信号到达第一个上升沿之前就将“输出信号”复位,在一定程度上减少X不定态持续时间。

实现该功能逻辑核心代码如下:

always @ (posedge clk or negedge rstn)

在TB中对rstn信号设置:

rstn信号从高电平开始,置零触发RTL中negedge下降沿敏感信号,if语句对输出信号置零,然后回到高电平,最后触发pseedge正常运行与电路功能

具体代码截图:

RTL:

image4

TB:

image5


3.28更新

利用VCS特性可完全消除在波形开始时的X不定态

VCS特性:若开始时negedge rstn = 0,则默认会检测到一个下降沿

所以修改TB中的代码在赋值时一开始就将rstn置0,然后置1即可,若中间在任何时候需要再次复位操作,即可在TB中加入对应的时间复位即可,以上操作就叫做异步复位操作

代码:

initial begin
...
	rstn = 1'd0;
 #3 rstn = 1'd1;
end