提问人:AGoodStudent 提问时间:11/13/2023 最后编辑:toolicAGoodStudent 更新时间:11/24/2023 访问量:60
数组右移错误:前缀中不允许使用范围
Array Right Shifter error: range is not allowed in prefix
问:
我正在尝试实现一个数组 Right Shifter。
它接受一个整数数组,然后将所有内容右移到指定索引位置的右侧,并在索引位置插入指定的整数值。
例如
如果 arr = {1, 2, 3, 4, 5, 6, 7, ....16};idx = 4;insert_value = 0; 然后 new_arr = {1, 2, 3, 0, 4, 5, 6, ...15}
以下是我的代码:
// Right shifts the arrays from given index, and inserts given value.
`timescale 1ns / 1ps
module indexed_rsh(
input wire [511:0] arr,
input wire [3:0] idx,
input wire [31:0] insert_value,
output wire [511:0] new_arr
);
logic [0:15][31:0] arr_sig, new_arr_sig;
assign arr_sig = arr;
assign new_arr = new_arr_sig;
genvar i;
generate
for (i=0; i < 16; i = i + 1)
begin
always_comb
if(idx == i)
new_arr_sig [0:15][31:0] = {arr_sig[0:i-1][31:0], insert_value, arr_sig[i:14][31:0]};
end
endgenerate
endmodule
在 EDAplayground 上,我在第 21 行出现语法错误,在第 23 行出现“错误:无效的模块项”。
在 Vivado 中,我在第 23 行收到一个错误,指出“前缀中不允许使用范围”。 如果前缀中不允许使用 range,那么索引 2D 数组的好方法是什么?
答:
以下是在给定的 32 位索引偏移量处将 32 位值插入到 512 位值中的一种方法,同时将其他位向右移动:
module indexed_rsh (
input wire [511:0] arr,
input wire [3:0] idx,
input wire [31:0] insert_value,
output reg [511:0] new_arr
);
always_comb begin
for (int i=0; i<16; i++) begin
int offset32;
offset32 = 32*i;
for (int j=0; j<32; j++) begin
if (i < idx) begin
new_arr[j + offset32] = arr[j + offset32];
end else if (i == idx) begin
new_arr[j + offset32] = insert_value[j];
end else begin
new_arr[j + offset32] = arr[j + offset32 - 32];
end
end
end
end
endmodule
如果要使用内部 2D 打包阵列:
module indexed_rsh (
input wire [511:0] arr,
input wire [3:0] idx,
input wire [31:0] insert_value,
output wire [511:0] new_arr
);
logic [15:0][31:0] arr_sig, new_arr_sig;
assign arr_sig = arr;
assign new_arr = new_arr_sig;
always_comb begin
for (int i=0; i<16; i++) begin
if (i < idx) begin
new_arr_sig[i] = arr_sig[i];
end else if (i == idx) begin
new_arr_sig[i] = insert_value;
end else begin
new_arr_sig[i] = arr_sig[i-1];
end
end
end
endmodule
(回复 toolic,作为回复发布以附上图片)
嗨,我想在这里更新一下,上面的代码没有合成预期的电路。
也许 Vivado 因为在“if”条件中使用了“i”而感到困惑,并试图为此生成硬件。
我尝试使用 generate 来指定我不想合成 if 条件,但我收到语法错误。对于我的理想电路,我需要弄清楚在始终>for->if块的巢中理想地放置生成的位置。
现在,我最终做了一个分层模块,其中包含下图所示的逻辑。图像中显示的逻辑是针对数组的每个元素实例化的。我使用生成 for 循环将信号 ref_const[i] 硬连线到值 'i'(0 表示第一次实例化,1 表示第二次实例化,...)。
(我将 Sel=0 分配给错误,因为我的数组将始终具有非零值)
评论