打印
[Verilog HDL]

verilog基础——always、initial

[复制链接]
2169|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2023-11-30 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

     验证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



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1025

主题

11271

帖子

25

粉丝