我正在编译错误"自动变量可能不会用于非程序结构"这样做
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
答案 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);