Quero acessar uma fatia com um valor dinâmico. Eu tentei fazer isso de maneiras diferentes. No primeiro caso reduzindo a lógica do módulo para controle do valor do índice etc, o verilator me disse que não é um valor constante e eu concordo com isso e depois mudei para a segunda versão mas obtive o mesmo resultado.
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
A lógica que estou tentando implementar é o modo de arredondamento do riscv-v 1.0.
Já tentei vários testes tentando fazer lógica estática mas não consigo encontrar uma maneira de resolver o problema. Como posso implementar essa lógica em hardware.
Se você está tentando implementar o
rne
modo, parece que está faltando um pouco de lógica. De acordo com a especificação RVV-v1.0, para executarrne
você precisa calcular o incremento de arredondamento usando a seguinte lógica ->v[d-1] & (v[d-2:0]!= 0 | v[d])
.Além disso,
in1
seu vetor de entrada não é? Você está tentando indexarin2
qual é o seu índice comin1
qual é o seu vetor real a ser indexado. Você também não precisa especificar a largura da sua lógica (como emin1[in2[4:0]-1]
), ela pode ser descrita comoin1[in2-1]
.Para conseguir o que você está tentando fazer, usar funções pode ser bastante útil, então sugiro dar uma olhada nas funções em SV.