我想访问具有动态值的切片。我尝试过以不同的方式做到这一点。在第一种情况下,减少了用于控制索引值等的模块逻辑,verilator告诉我这不是一个常量值,我同意这一点,然后我更改了第二个版本,但得到了相同的结果。
1:
module m1 (
input logic [4:0] in1, // 8-bit input vector 1
input logic [4:0] in2, // 8-bit index
output logic [4:0] out // 8-bit output vector
);
logic add;
always_comb begin
add = (in2[in1[4:0]-1] & (in2[(in1[4:0]-2):0] != '0); //summary rounding
end
out = in1 + add;//summary of the final operation
endmodule
2:
module m1 (
input logic [4:0] in1, // 8-bit input vector 1
input logic [4:0] in2, // 8-bit index
output logic [4:0] out // 8-bit output vector
);
logic add;
always_comb begin
for (int i = 0; i < 4; i++) begin
if((in1[4:0]-2) == i)begin
add = (in2[in1[4:0]-1] & (in2[(i:0] != '0); //summary rounding
end
end
out = in1 + add;//summary of the final operation
endmodule
我试图实现的逻辑是 riscv-v 1.0 的舍入模式。
我已经尝试了几次尝试进行静态逻辑的测试,但我找不到解决问题的方法。我如何在硬件中实现这个逻辑。
如果您尝试实现该
rne
模式,那么您似乎缺少一些逻辑。根据 RVV-v1.0 规范,要执行此操作,rne
您需要使用以下逻辑 -> 来计算舍入增量v[d-1] & (v[d-2:0]!= 0 | v[d])
。in1
另外,你输入的不是向量吗?您正在尝试将in2
您的索引与in1
要索引的实际向量进行索引。您也不必指定逻辑的宽度(如 中in1[in2[4:0]-1]
),它可以描述为in1[in2-1]
。为了实现你想要做的事情,使用函数可能非常有用,所以我建议看看 SV 中的函数。