我现在正尝试在位数组中强制位。被“强制”的位的位置取决于变量i,而其他位保持为0。
例如,如果我有数组位[2:0] A
当i=0
时,我希望A
是3'b001
,当i=1
时,A
应该是3'b010
,而i=2
,{{1 }}应该是A
但由于要编写测试平台来测试信号路径,因此必须使用force语句。
有人知道我该怎么做吗?
更新1:@Serge我必须使用这样声明的force语句:bit [31:0] A我试过了:force A [31:0] = 32'd0;对于(int i = 0; i <= 31; i ++)开始作用力A [i] = 1;结束显然它不起作用。其实我在测试不同的scearios,以查看信号路径是否正确完成
update2:我现在生成了一个脚本来强制信号一个接一个 但是,我不确定是否遇到错误 执行此语句时 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,0,`TOP_TB.clk_1T,0}; a [1]保持为0。相反,1T clk出现在a [0]。有人知道发生了什么吗?
update3:谢谢您的帮助!我实际上以为0是32位解释的,但是我真的不知道为什么1T clk出现在bit 0而不是bit 1(我使用的是questasim) 。顺便说一句,我已经通过生成脚本解决了这一问题,并将内容复制并粘贴到脚本生成的文本文件中。
答案 0 :(得分:0)
您可以在Verilog中使用位索引来完成所需的操作。就像在C中索引到数组一样。例如:
array_a[i] <= new_value;
在上面的代码中,如果i为0,它将为位0分配new_value,其余部分保持不变。
答案 1 :(得分:0)
摘自《语言参考手册》(IEEE标准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入门版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};
为我工作。当然,您也可以将该结构插入到我的示例中使用的“ case”中。
答案 2 :(得分:-1)