首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统verilog/verilog -事件

系统verilog/verilog -事件
EN

Stack Overflow用户
提问于 2012-08-03 13:27:24
回答 3查看 1.1K关注 0票数 0
代码语言:javascript
复制
task monitorPush();
  begin
    bit [7:0] data = 0;
    while (1) begin
      @ (posedge intf.clk);
      if (intf.cb.wr_cs== 1 &&  intf.cb.wr_en== 1) begin
        // @ (posedge intf.clk);
        data = intf.data_in;
        sb.addItem(data);
        $write("%dns : Write posting to scoreboard data = %x\n",$time, data);
      end
    end
  end
  endtask

上面的代码和下面的代码有什么不同?例如,将后边缘时钟从第5行移动到第7行是如何改变代码的?提前感谢

代码语言:javascript
复制
task monitorPush();
  begin
    bit [7:0] data = 0;
    while (1) begin
      // @ (posedge intf.clk);
      if (intf.cb.wr_cs== 1 &&  intf.cb.wr_en== 1) begin
        @ (posedge intf.clk);
        data = intf.data_in;
        sb.addItem(data);
        $write("%dns : Write posting to scoreboard data = %x\n",$time, data);
      end
    end
  end
endtask
EN

回答 3

Stack Overflow用户

发布于 2012-08-03 17:42:13

@(posedge intf.clk)等待时钟的后边缘,然后继续执行。

代码的版本1等待clk (posedge),然后执行if语句。

版本2:在if语句失败的情况下,将在while true块内连续执行,直到if变为true,然后等待clk posedge。

票数 2
EN

Stack Overflow用户

发布于 2014-12-10 14:28:30

在版本2中,您有可能陷入无限循环,因为模拟器将在计算while循环和if语句时卡住,并且不会切换到执行代码的其他部分。在版本1中,@(posedge intf.clk)会让模拟器跳转到代码的其他部分。简而言之,使用版本1。

票数 1
EN

Stack Overflow用户

发布于 2018-08-31 13:12:16

版本2)将挂起您的模拟,因为您没有if的else条件。从调用monitor函数的那一刻起,第一次遇到wr_cs/wr_en为零将陷入while(1)无限循环,因为没有else条件,也没有任何计时事件。

版本1是正确的使用方式。大多数时候,你的控制和数据信号会随着时钟的变化而改变。

在版本1)中,当CS/WEN变高时,您将在时钟边沿上采样计分板的数据

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11789771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档