Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog sv中任务内部逻辑的阻塞分配_Verilog_System Verilog - Fatal编程技术网

Verilog sv中任务内部逻辑的阻塞分配

Verilog sv中任务内部逻辑的阻塞分配,verilog,system-verilog,Verilog,System Verilog,我正在尝试执行以下代码,但我看到value2没有按预期更新。value1的先前值保留在value2中 class a; logic [31:0] value1,value2; task a; for(i=0;i<=width;i=i+1) begin @(vif.clk) value[0]=`vif.si; value=value<<1; end endtask value2=value1; e

我正在尝试执行以下代码,但我看到value2没有按预期更新。value1的先前值保留在value2中

class a;
  logic [31:0] value1,value2;

  task a;
    for(i=0;i<=width;i=i+1)
    begin
      @(vif.clk)

      value[0]=`vif.si;
      value=value<<1;
    end
  endtask

  value2=value1;

endclass
a类;
逻辑[31:0]值1,值2;
任务a;

对于(i=0;i您的代码示例不完整。我猜您是在类主体内定义行'value2=value1;'。这不是一个连续赋值,您可能习惯于从模块中进行赋值。这只是意味着它将定义一个名为value2的字段(我认为是wire类型),并将其初始值设置为字段'value'的值(我认为您的意思是value,因为我看不到对value1的引用)

您希望使用阻塞分配这一事实意味着,如果要在value2中存储“value”的前一个值,则必须在任务“a”中执行。您不能从其他并行线程执行此操作,因为您不知道调用它们的顺序。示例:

task a();
  value2 = value; // save value and then proceed to update it
  for(i=0;i<=width;i=i+1) begin 
    @(vif.clk);
    value[0]=vif.si;
    value=value<<1;
  end
endtask
task a();
value2=value;//保存值,然后继续更新

对于(i=0;i请使用代码标记。使用任务名称(或任何属性名称)是非常糟糕的编程实践给定与中定义的类名相同的名称。
a
语句value2=value1;不合法。这永远不会编译。请显示您正在执行的代码。您好,问题已经解决。我使用了一个临时变量来存储上一个值,当循环最后一次迭代时,我写入事务项。我看到了期望值。在使用阻塞分配时,我必须小心。感谢所有有价值的评论。:)您好,我在for循环后分配值value2=值。但是,一旦for循环完成,更新的数据或当前数据就不会分配给value2。而是保留以前的值。如上所述,行value2=值并不意味着您在for循环完成后分配。