Verilog 运算符 RTL 与测试平台小项目
Verilog Operators — RTL & Testbench Mini-Project
- Verilog HDL_Machine Problem
运算符运算代码如下

仿真结果:

- 观察波形发现c、d、e的初始值为x不定态
原因:在上文TB中(initial ain= 4‘d0…)只对输入进行了初始化,而并没有对输出值初始化,而输出的初始化一般在例化(RTL)中,后续补充

-
此外仔细观察以上中间段不定态的波形会发现当上升沿来到时,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:

TB:

3.28更新
利用VCS特性可完全消除在波形开始时的X不定态
VCS特性:若开始时negedge rstn = 0,则默认会检测到一个下降沿
所以修改TB中的代码在赋值时一开始就将rstn置0,然后置1即可,若中间在任何时候需要再次复位操作,即可在TB中加入对应的时间复位即可,以上操作就叫做异步复位操作
代码:
initial begin
...
rstn = 1'd0;
#3 rstn = 1'd1;
end