在Verilog中,有一种简单的方法可以指定一次执行大量操作吗?例如,下面的verilog模块在一个时钟周期内在输入上迭代一个简单的函数十次。
module test (val_in,val_out);
input [15:0] val_in;
output [15:0] val_out;
wire [15:0] vals[10:1];
integer i;
assign vals[1]=val_in*val_in+val_in;
assign vals[2]=vals[1]*vals[1]+val_in;
assign vals[3]=vals[2]*vals[2]+val_in;
assign vals[4]=vals[3]*vals[3]+val_in;
assign vals[5]=vals[4]*vals[4]+val_in;
assign vals[6]=vals[5]*vals[5]+val_in;
assign vals[7]=vals[6]*vals[6]+val_in;
assign vals[8]=vals[7]*vals[7]+val_in;
assign vals[9]=vals[8]*vals[8]+val_in;
assign vals[10]=vals[9]*vals[9]+val_in;
assign val_out=vals[10];
endmodule // test
有没有办法在不单独指定每个迭代的情况下执行此操作?我知道可以创建一个循环并在每次迭代时存储一个值,但这与上面的不同,因为它无法在一个时钟周期内运行。
对不起,如果这是一个天真的问题;我对Verilog很新。
答案 0 :(得分:3)
可以为遵循模式的变量创建循环,因为其他变量保持不变,这里vals[1]
和val_out
似乎有不同的模式,因此将它们与循环隔离
module test (val_in,val_out);
input [15:0] val_in;
output [15:0] val_out;
wire [15:0] vals[10:1];
assign vals[1]=val_in*val_in+val_in;
genvar i;
generate
for(i=2; i<=10; i=i+1) begin : grouped_vals
assign vals[i]=vals[i-1]*vals[i-1]+val_in;
end
endgenerate
assign val_out=vals[10];
endmodule
答案 1 :(得分:1)
即使您可以通过添加如下参数来概括上述解决方案。
module test (val_in,val_out);
parameter COUNT = 16;
input [COUNT-1 : 0] val_in;
output [COUNT-1 : 0] val_out;
wire [COUNT-1 : 0] vals[COUNT-1 : 1];
assign vals[1]=val_in*val_in+val_in;
genvar i;
generate
for(i=2; i<COUNT; i=i+1) begin : grouped_vals
assign vals[i]=vals[i-1]*vals[i-1]+val_in;
end
endgenerate
assign val_out = vals[COUNT-1];
endmodule