首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >always_comb与and @(*)的行为差异

always_comb与and @(*)的行为差异
EN

Stack Overflow用户
提问于 2015-09-25 09:16:24
回答 2查看 11K关注 0票数 2

我刚刚发现,当涉及function时,总是@(*)不像预期的那样工作。

请参阅下面的简单示例代码。

http://www.edaplayground.com/x/J7M

代码语言:javascript
复制
module test;
  reg a, b, c;

  function reg my_func();
    if (b==0) begin
      $display("DEBUG 0 @%0t", $time);
      return a;
    end
    else if (b==1) begin
      $display("DEBUG 1 @%0t", $time);
      return ~a;
    end
    else begin
      $display("DEBUG 2 @%0t", $time);
      return 0;
    end
  endfunction

  always @(*) begin
  //always_comb begin
    c = my_func();
  end

  initial begin
    a = 0; #10;
    a = 1; #10;
    a=0; 
  end
endmodule

在仿真中尝试在always @(*)always_comb之间切换。如果我使用always @(*),什么都不会显示。但是,如果我使用always_comb,它将显示预期的结果如下:

代码语言:javascript
复制
DEBUG 2 @0
DEBUG 2 @0
DEBUG 2 @10
DEBUG 2 @20

上面的代码只是简单的组合逻辑。为什么always @(*)always_comb显示不同的结果?这仅仅是模拟问题吗?在进一步的实验中,我注意到这可能与始终块中function的使用有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-25 10:41:08

始终@(*)块对所有变量的值变化都很敏感,这些变量是由始终块读取的,或者可以说是位于始终块内部右侧的变量。

在您的示例中,始终块中没有使用任何变量,所以这个始终是@(*)的块在这里不能工作。

根据SV LRM,

always_comb对函数内容中的更改非常敏感,而@*始终只对函数的参数更改敏感。

也就是说,每当函数中的变量发生变化时,always_comb就会触发,但在您的情况下,只有在函数中传递参数时,始终@(*)才会触发。

所以要么你可以用,

代码语言:javascript
复制
  always @(*) begin
    c = my_func(b);  
  end

或者你可以用,

代码语言:javascript
复制
  always_comb begin
    c = my_func();  
  end

我修改了你的密码。请在以下链接中找到它。

http://www.edaplayground.com/x/JiS

票数 9
EN

Stack Overflow用户

发布于 2015-09-25 15:30:42

always @(*)由Verilog 1364-2001标准添加,在SystemVerilog IEEE1800-2005标准中被always_comb所取代。不应该再使用always @(*),因为它不能在所有情况下正确地模拟硬件。除了函数的不同之外,它不能正确地处理常量逻辑。

代码语言:javascript
复制
parameter C = 0;
reg A,B;
always @(*) A = B && C;

在对A进行更改之前,B仍然是未知的。而使用always_comb将立即将A设置为0,因为在时间0处的执行是有保证的。

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

https://stackoverflow.com/questions/32778798

复制
相关文章

相似问题

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