首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对ref参数的非阻塞赋值

对ref参数的非阻塞赋值
EN

Stack Overflow用户
提问于 2017-08-30 00:24:18
回答 1查看 268关注 0票数 0

我想了解一下System Verilog中的任务是如何工作的。我认为任务只是一种命名和参数设置的方式,否则可能会出现在beginend之间的一些代码。然而,参数的工作方式并不明显。

假设我想从模块中提取出非阻塞赋值的实例。我可能会做类似以下的事情,从而达到同一任务的两个实例只是参数(ff_0和ff_1)不同的地步。

代码语言:javascript
复制
module test_inlined;

bit clk;
int count = 0;   
logic [7:0] x, y, z;

task automatic ff_0;
   @(posedge clk);
   y <= x;
endtask

task automatic ff_1; // really same task as ff_0 to within variable renaming
   @(posedge clk);
   z <= y;
endtask   

always
  ff_0;

always
  ff_1;

always @(posedge clk)
  $strobe("%d: x=%d, y=%d, z=%d", count, x, y, z);

always
  #5 clk = !clk;

always @(posedge clk)
  begin
    x <= count;
    count ++;
    if (count > 20) $finish;    
  end   

endmodule

相反,将分解出的赋值(也称为触发器)放入同一模块的两个实例化中是很简单的,因此也可以用同一任务的两个实例来表示相同的功能。

以下代码不起作用,因为out应该是自动的,或者说这就是Modelsim所声称的。我不明白为什么会这样,因为它显然是对模块的静态成员的引用。

代码语言:javascript
复制
task automatic ff (ref logic [7:0] out, ref logic [7:0] inp, ref bit clk);
 @(posedge clk);
 out <= inp;
endtask   

module test_broken;

  bit clk;
  int count = 0;   
  logic [7:0] x, y, z;

  always
    ff(y, x, clk);

  always
    ff(z, y, clk);

  // .... same as before

endmodule

任务需要自动使用ref参数是有意义的,因为这样就不需要担心它们的生命周期了。不太清楚为什么只允许阻塞对自动变量的赋值。当有未决的非阻塞赋值时,不会有任何明显的自动变量消失的需求?

请问如何将非阻塞赋值分解到任务中?在此之前,非常感谢您。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 02:13:51

问题是task不能假定传递给它的变量的存储分类。为任务生成的代码必须适用于任何类型的存储,因此传递ref时必须遵守悲观的限制集。

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

https://stackoverflow.com/questions/45944033

复制
相关文章

相似问题

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