module test(
input [15:0] in,
output [15:0] out);
reg [1:0] Xai_out [7:0];
reg [1:0] c_accum_in [7:0];
integer i;
initial begin
i = 10'd0;
end
always @(*) begin
c_accum_in[0] = in[1:0];
c_accum_in[1] = in[3:2];
c_accum_in[2] = in[5:4];
c_accum_in[3] = in[7:6];
c_accum_in[4] = in[9:8];
c_accum_in[5] = in[11:10];
c_accum_in[6] = in[13:12];
c_accum_in[7] = in[15:14];
end
genvar c;
generate
for(c = 6;c < 8; c= c + 1) begin:b0
always @(*)
Xai_out[i] = c_accum_in[c];
i = i + 1;
end
for(c = 4;c < 6; c= c + 1) begin:b1
always @(*)
Xai_out[i] = c_accum_in[c];
i = i + 1;
end
for(c = 2;c < 4; c= c + 1) begin:b2
always @(*)
Xai_out[i] = c_accum_in[c];
i = i + 1;
end
for(c = 0;c < 2; c= c + 1) begin:b3
always @(*)
Xai_out[i] = c_accum_in[c];
i = i + 1;
end
endgenerate
endmodule我做了一个轮换代码来改变他们的位置。
每一个接近文本的i = i + 1都有错误(期望“。或"(")。
我不知道这部分的语法错误是什么。
在generate语句中不可能使用i吗?
发布于 2022-07-21 18:49:56
代码中有两个问题:
i是一个动态变量,因此它不能在“生成”块中使用,只有当它是常数时才能操作constants.i = i + 1这样的表达式。为了保持代码的生成性,您需要消除这两种代码。在您的情况下,您可以执行如下操作:
genvar c;
generate
for(c = 6;c < 8; c= c + 1) begin:b0
always @(*)
Xai_out[c-6] = c_accum_in[c-6];
end
for(c = 4;c < 6; c= c + 1) begin:b1
always @(*)
Xai_out[3+c-4] = c_accum_in[3+c-4];
end
for(c = 2;c < 4; c= c + 1) begin:b2
always @(*)
Xai_out[5 + c - 2] = c_accum_in[5 + c - 2];
end
for(c = 0;c < 2; c= c + 1) begin:b3
always @(*)
Xai_out[7 + c] = c_accum_in[7 + c];
end
endgenerate它将表达式移动到位下标,但需要您仔细计算。我希望在这件事上我是对的:)
发布于 2022-07-21 18:56:05
不需要生成块。这在3个模拟器中编译时没有警告。
module test(
input [15:0] in,
output [15:0] out);
reg [1:0] Xai_out [7:0];
reg [1:0] c_accum_in [7:0];
integer i;
initial begin
i = 10'd0;
end
always @(*) begin
c_accum_in[0] = in[1:0];
c_accum_in[1] = in[3:2];
c_accum_in[2] = in[5:4];
c_accum_in[3] = in[7:6];
c_accum_in[4] = in[9:8];
c_accum_in[5] = in[11:10];
c_accum_in[6] = in[13:12];
c_accum_in[7] = in[15:14];
end
always @(*) begin :always_block
//
int i,j,k,l;
//
for(int c = 6;c < 8; c= c + 1) begin:b0
Xai_out[i] = c_accum_in[c];
i = i + 1;
end
for(int c = 4;c < 6; c= c + 1) begin:b1
Xai_out[j] = c_accum_in[c];
j = j + 1;
end
for(int c = 2;c < 4; c= c + 1) begin:b2
Xai_out[k] = c_accum_in[c];
k = k + 1;
end
for(int c = 0;c < 2; c= c + 1) begin:b3
Xai_out[l] = c_accum_in[c];
l = l + 1;
end
//
end:always_block
endmodulehttps://stackoverflow.com/questions/73068454
复制相似问题