验证random模块时,模块中的rst和soft_rst都是模块的端口,rst为高有效,soft_rst为低有效。前期并没有测试soft_rst,后期发现本测试点,并进行验证时,发现在vip中并没有soft_rst以端口形式存在。刚开始想自己加上,后来觉着将soft_rst和rst连接比较方便。尝试使用forever、initial和always,发现自己对这几个使用有所欠缺。
top_test中对rst的赋值
reg rst_n = 'b0;
initial begin
#200;
rst_n = 1'b1;
end
过程
刚开始rst_n为0,在200ns之后再赋值为1,所以想在300ns后再将soft_rst赋值为rst,所以使用以下代码,代码可以编译通过,但是,仿真跑不起来,说明这种方**导致仿真从一开始hang住,sim.log是空白的,猜测是rst_n刚开始有。
reg soft_rst = 'b0;
initial begin
#300;
forever begin
rst_n = ~soft_rst;
end
end
后面将forever改为always,编译就会有问题,Error: Syntax error : token is 'always'
reg soft_rst = 'b0;
initial begin
#300;
if ($test$plusargs("random_soft_rst")) begin
always@(soft_rst) begin
rst_n = ~soft_rst;
end
end
end
后面查了一下这几个的用法和思考哪里出了问题,发现always和initial是从仿真一开始同时立即执行,所以always块不能放在initial块中,更加不能加上延时。后面又尝试将initial块和延时去掉,出现elab fail,原因是if语句不能孤立的放在module中。
改为下面,就没有问题了,但是rst_n在刚开始就为1,没办法像之前一样在200ns之后再改变,仿真暂时可以通过,就先这样了,如果有知道的小伙伴,告诉一下,感谢~
reg soft_rst = 'b0;
always@(soft_rst) begin
if ($test$plusargs("random_soft_rst")) begin
rst_n = ~soft_rst;
end
end
|