有可能是Synopsys这几年发展太过迅速了吧,感觉软件升级是挺快,不过感觉BUG倒也是真多。
这不,今天发现使用UVMGEN工具生成的Top Module时有一个很不应该犯下的错误。
我们来看看是怎么回事啊。下面这段代码是该工具生成的,我很纳闷,
module top_mod();
logic clk; logic rst;
// Clock Generation parameter sim_cycle = 10; // Reset Delay Parameter parameter rst_delay = 50; always begin clk = #(sim_cycle/2) ~clk; end // ToDo: Include Dut instance here //Driver reset depending on rst_delay initial begin clk = 0; rst = 0; #1 rst = 1; repeat (rst_delay) @(clk); rst = 1'b0; @(clk); end
endmodule
当你拿这段代码到仿真器里运行的时候,你会惊奇的发现你想要的时钟怎么没有了呢,都是红线(不定态,unknown)。
无论你是使用VCS,VSIM还是NCSIM,结果都是一样的。其实,细细分辨你就会明白。原来是delay control用错了。
将clk = #(sim_cycle/2) ~clk 改成#(sim_cycle/2)clk = ~clk就OK了。
当然,这是对verilog语义理解的一个小小的错误。
前者的意思是将clk当前值取反(在此为0时刻),延迟sim_cycle个仿真单位时间后将赋值给clk。可是,你应该明白,
0时刻,clk的值是不定态啊。
后者的意思是延迟sim_cycle个仿真单位时间后将clk取反后赋值给clk。在延迟sim_cycle个仿真单位时间后,显然,
此时的clk已经在initial中早已赋值为0了。这样就能正确产生需要的时钟。
今天在这时花这些时间提这个事情,一是我真正遇到了,我觉得奇怪,运气不好,二是觉得很难理解像Synopsys这样的公司也会犯下
这种级别的错误,奇也怪哉。