Из Справочного руководства по языку (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};
у меня работает. Вы, конечно, можете вставить эту конструкцию в «случай», который я использовал и в моем примере.