当前位置:   article > 正文

verilog基础——always、initial_verilog wait

verilog wait

目录

前言

过程

总结

initial和always

  1、initial

  2、always

  3、always@() 

(1)always块的边沿触发和电平触发

(2)always@ (*)

(3)always wait()


前言

     验证random模块时,模块中的rst和soft_rst都是模块的端口,rst为高有效,soft_rst为低有效。前期并没有测试soft_rst,后期发现本测试点,并进行验证时,发现在vip中并没有soft_rst以端口形式存在。刚开始想自己加上,后来觉着将soft_rst和rst连接比较方便。尝试使用forever、initial和always,发现自己对这几个使用有所欠缺。

top_test中对rst的赋值

  1. reg rst_n = 'b0;
  2. initial begin
  3. #200;
  4. rst_n = 1'b1;
  5. end

过程

    刚开始rst_n为0,在200ns之后再赋值为1,所以想在300ns后再将soft_rst赋值为rst,所以使用以下代码,代码可以编译通过,但是,仿真跑不起来,说明这种方法会导致仿真从一开始hang住,sim.log是空白的,猜测是rst_n刚开始有。

  1. reg soft_rst = 'b0;
  2. initial begin
  3. #300;
  4. forever begin
  5. rst_n = ~soft_rst;
  6. end
  7. end

    后面将forever改为always,编译就会有问题,Error: Syntax error  : token  is  'always'

  1. reg soft_rst = 'b0;
  2. initial begin
  3. #300;
  4. if ($test$plusargs("random_soft_rst")) begin
  5. always@(soft_rst) begin
  6. rst_n = ~soft_rst;
  7. end
  8. end
  9. end

后面查了一下这几个的用法和思考哪里出了问题,发现always和initial是从仿真一开始同时立即执行,所以always块不能放在initial块中,更加不能加上延时。后面又尝试将initial块和延时去掉,出现elab fail,原因是if语句不能孤立的放在module中。

改为下面,就没有问题了,但是rst_n在刚开始就为1,没办法像之前一样在200ns之后再改变,仿真暂时可以通过,就先这样了,如果有知道的小伙伴,告诉一下,感谢~

  1. reg soft_rst = 'b0;
  2. always@(soft_rst) begin
  3. if ($test$plusargs("random_soft_rst")) begin
  4. rst_n = ~soft_rst;
  5. end
  6. end

总结

initial和always

<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/784445
推荐阅读
相关标签
  

闽ICP备14008679号