首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟阻塞/非阻塞

延迟阻塞/非阻塞
EN

Stack Overflow用户
提问于 2014-10-17 02:58:55
回答 1查看 823关注 0票数 2

我现在被一段Verilog代码搞糊涂了,它的那种测试阻塞或非阻塞分配的特性结合了延迟模型。

代码在EDA游乐场下面

代码语言:javascript
复制
module cl_tb;
  reg x,y,z;

  initial begin
    x = 2;
    #4;
    y <= #9 x;
    x = 1;
    #50 $stop;
  end

  initial begin
    $monitor("%0t,%d,%d,%d",$time,x,y,z);
  end

  always @(x,y) begin
    z = # 2 x+y;
  end 
endmodule 

通过手工计算,根据Verilog分层事件,我可以得到结果时间:X值,Y值,Z值如下:

代码语言:javascript
复制
 0: 2,x,x
 2: 2,0,2 
 4: 1,0,2
 6: 1,0,1
13: 1,2,1
15: 1,2,3

然而,模拟结果是:

代码语言:javascript
复制
 0,0,x,x
 4,1,x,x
13,1,0,x
15,1,0,1

我想知道为什么总是@(x,y)不是在时隙2和4触发的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 12:11:09

你把x,y,z声明为1位。因此,当设置为2时,您只能得到2'b10的LSB (位0)。

如果您只是测试延迟建模,那么使用整数而不是reg。

代码语言:javascript
复制
integer x,y,z;

您现在应该会看到高于1的值。这是EDA游乐场上的一个更新的示例。

如果我把你的显示器更新为显示器

代码语言:javascript
复制
initial begin
  forever begin
    $display("%3t: %2d,  %2d,  %2d",$realtime, x, y, z);
    #2;
  end
end

我在#2中没有得到相同的结果,但是如果我们将循环延迟更改为#1,它看起来就像预期的那样工作。我尝试过强迫`timescale,但这并不能解决这个问题。

代码语言:javascript
复制
# KERNEL:   0:  2,   0,   0
# KERNEL:   1:  2,   0,   0
# KERNEL:   2:  2,   0,   2 //<-- update at time 2

注意:自动灵敏度列表有助于最小化RTL到门模拟错配。

代码语言:javascript
复制
always @(a,b) begin

变成了

代码语言:javascript
复制
always @* begin
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26417206

复制
相关文章

相似问题

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