2015-06-14 239 views
0

在Verilog中,是否有一种简单的方法来指定一次执行大量操作?例如,下面的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

为什么你认为循环将无法在单个时钟周期内运行?循环只有在编译时可以展开才能合成,因此它应该展开到与您在此处完全相同。 – Morgan

+0

Morgan,我认为OP的意思是“使用一个乘法器并将输出路由回输入”作为“循环”,而不是构建“生成”循环。 – wilcroft

+1

@wilcroft,同意,只是试图让OP质疑他们为什么认为它不起作用。个人会避免生成并在'always_comb'块中放置一个。认为OP可能认为这意味着多个时钟周期。 – Morgan

回答

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 
+0

这正是我正在寻找的 - 谢谢! – Svetlana

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 
+1

在问题2中使用了不同的宽度16位宽和10个位置:可能使用2个参数将提供更精确的匹配,例如'wire [COUNT_A-1:0] vals [COUNT_B-1:1];' – Morgan