来自语言参考手册(IEEE Std 1800-2017),第 10.6.2 节(“强制和释放程序语句”):
赋值的左侧可以是对奇异变量、网络、向量网络的常数位选择、向量网络的常数部分选择或这些的串联的引用。它不应是变量或具有用户定义的网络类型的网络的位选择或部分选择。
看来不能直接做你想做的事。
我最好的选择是或多或少地做你想做的事情(我只是强迫一个位,而让其他位正常发展),请记住,力分配的 LHS 应该是恒定的,类似于这个:
module dut (
input logic [31:0] a,
input logic [31:0] b,
output logic [31:0] z
);
always_comb z = a & b;
endmodule: dut
module tb;
logic [31:0] a;
logic [31:0] b;
logic [31:0] z;
dut dut (.*);
logic clk = 0;
initial forever
#(5ns) clk = !clk;
logic [5:0] sel;
initial forever begin
case (sel)
6'd0: force z[0] = clk;
6'd1: force z[1] = clk;
6'd2: force z[2] = clk;
6'd3: force z[3] = clk;
6'd4: force z[4] = clk;
6'd5: force z[5] = clk;
6'd6: force z[6] = clk;
6'd7: force z[7] = clk;
6'd8: force z[8] = clk;
6'd9: force z[9] = clk;
6'd10: force z[10] = clk;
6'd11: force z[11] = clk;
6'd12: force z[12] = clk;
6'd13: force z[13] = clk;
6'd14: force z[14] = clk;
6'd15: force z[15] = clk;
6'd16: force z[16] = clk;
6'd17: force z[17] = clk;
6'd18: force z[18] = clk;
6'd19: force z[19] = clk;
6'd20: force z[20] = clk;
6'd21: force z[21] = clk;
6'd22: force z[22] = clk;
6'd23: force z[23] = clk;
6'd24: force z[24] = clk;
6'd25: force z[25] = clk;
6'd26: force z[26] = clk;
6'd27: force z[27] = clk;
6'd28: force z[28] = clk;
6'd29: force z[29] = clk;
6'd30: force z[30] = clk;
6'd31: force z[31] = clk;
endcase
@(clk or sel);
release z[0];
release z[1];
release z[2];
release z[3];
release z[4];
release z[5];
release z[6];
release z[7];
release z[8];
release z[9];
release z[10];
release z[11];
release z[12];
release z[13];
release z[14];
release z[15];
release z[16];
release z[17];
release z[18];
release z[19];
release z[20];
release z[21];
release z[22];
release z[23];
release z[24];
release z[25];
release z[26];
release z[27];
release z[28];
release z[29];
release z[30];
release z[31];
end
initial begin
a = 32'h0055aaffaa55ff00;
b = 32'habcdef0123456789;
sel = 6'd0;
#(98ns);
sel = 6'd6;
end
endmodule: tb
这适用于我的 ModelSim 版本(INTEL FPGA STARTER EDITION 10.6c)。
至于为什么你的代码:
a[31:0] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,`TOP_TB.clk_1T,0};
不起作用,我最好的猜测是每个“0”都被解释为一个整数 0,即32'd0。然后你就可以有效地得到一些东西了:
a[31:0] = {960'd0, `TOP_TB.clk_1T, 32'd0};
RHS 被截断以仅适合 32 位。截断当然意味着“32'd0”剩下的任何东西都被丢弃了,但你的编译器真的应该对此提出警告。比如:
a[31:0] = {30'b0,`TOP_TB.clk_1T,1'b0};
为我工作。当然,您也可以将该构造插入我在示例中使用的“案例”中。