system verilog [自动变量不能用于非程序结构]

时间:2017-02-02 08:12:01

标签: verilog system-verilog

我正在编译错误"自动变量可能不会用于非程序结构"这样做

task a (logic[31:0] b, int c)
begin
force global_variable[c] = ~global_variable[c]
end

endtask

其中global_variable是49位逻辑类型变量。声明为

logic global_variable[48:0]

我想要实现的是访问global_variable的指定位,传递给变量c并将其翻转。 但是,通过传递整数变量来访问特定位似乎存在问题。

谢谢:D

1 个答案:

答案 0 :(得分:2)

这里几乎没有什么不同的问题。

第一个是force语句,其中许多语句不包含使用自动变量创建的任何表达式。这是因为force语句效果的生存期可能会超出自动变量的生命周期。当您退出任务a时,自动变量c将消失,并且不再存在要使用的力的有效表达式。

通过使用中间静态变量,可以很容易地修复力的RHS。

task a (logic[31:0] b, int c)
  static int temp;
  begin
    temp = c;
    force LHS_signal= ~global_variable[temp;]
  end
endtask

但是接下来的问题是你不能在力的LHS上使用变量作为索引选择,即使它是静态的。如果您希望强制使用其他位并释放前一位,或者仅强制使用新位,则无法知道索引何时更改值。有很多方法可以通过使用更复杂的强制表达式,或者使用生成for循环语句来定义多个强制语句,每个语句都选择LHS上的固定位。

但在我告诉你之前,我需要指出最后一个问题;你不能强迫信号与自身相反。你能做的就是强迫信号与驱动信号相反。

wire A, B;
wire global_signal

assign global_signal = A & B;

...
force global_signal = ~(A & B);