For loop Verilog如何展开嵌套for循环?

For loop Verilog如何展开嵌套for循环?,for-loop,verilog,fpga,For Loop,Verilog,Fpga,我正在尝试用一系列嵌套的for循环进行累加求和,但运气不好。我想我需要更好地理解Verilog如何展开for循环,然后才能真正想象如何解决我的问题 基本上,我有一系列的抽头输出(抽头输出和抽头输出),它们是3D阵列(src、dst、tap)。我想把每个时钟上所有指向特定目的地的源和抽头相加 以下是我所拥有的不起作用的内容(out_sig每次都是0): //节点=2 线签名[DAC_总线_宽度-1:0]输出_信号_i[NODES-1:0]; 线签名[DAC_总线_宽度-1:0]out_sig_q[

我正在尝试用一系列嵌套的for循环进行累加求和,但运气不好。我想我需要更好地理解Verilog如何展开for循环,然后才能真正想象如何解决我的问题

基本上,我有一系列的抽头输出(抽头输出和抽头输出),它们是3D阵列(src、dst、tap)。我想把每个时钟上所有指向特定目的地的源和抽头相加

以下是我所拥有的不起作用的内容(out_sig每次都是0):

//节点=2
线签名[DAC_总线_宽度-1:0]输出_信号_i[NODES-1:0];
线签名[DAC_总线_宽度-1:0]out_sig_q[NODES-1:0];
reg已签名[DAC_总线_宽度-1:0]out_sig_i_reg[NODES-1:0];
reg已签名[DAC_总线_宽度-1:0]out_sig_q_reg[NODES-1:0];
整数dstVal、srcVal、tapVal;
//产生
始终@(posedge clk)开始:始终进行循环

对于(dstVal=0;dstVal
是的,我正在使用out_sig_I_reg和out_sig_q_reg作为我的累积和。我不知道的是如何让它累积和,并在每次求和之前重置为零……是的,我正在使用out_sig_I_reg和out_sig_q_reg作为我的累积和。我不知道的是如何让它累积和和和每次求和前都重置为零…感谢您的快速响应。那么您是否将这两个始终块放在一个较大的块中:for(dstVal=0;dstVal@toozie21不,您必须将其放在每个always块中。always in for并不常见,因为这会成为generate for循环。我添加了
/..
作为您填写循环详细信息的神秘指南。嗯,似乎不喜欢它。我有“always@*begin”和“for”(dstVal=0;dstVal@toozie21
out\u sig\u q
也需要声明为reg类型,但它不是触发器。请将reg用于
始终
初始
。连接
分配
和连接实例输出。感谢您的快速响应。您是否将这两个始终块放在一个较大的块中:例如(dstVal=0;dstVal@toozie21不,您必须将其放在每个always块中。always in for并不常见,因为这会成为generate for循环。我添加了
/..
作为您填写循环详细信息的神秘指南。嗯,似乎不喜欢它。我有“always@*begin”和“for”(dstVal=0;dstVal@toozie21
out\u sig\u q
也需要声明为reg类型,但它不是触发器。始终将reg用于
initial
。导线用于
分配
和连接实例输出。
//NODES = 2
wire signed [DAC_BUS_WIDTH-1:0]      out_sig_i [NODES-1:0];
wire signed [DAC_BUS_WIDTH-1:0]      out_sig_q [NODES-1:0];
reg signed [DAC_BUS_WIDTH-1:0] out_sig_i_reg[NODES-1:0];
reg signed [DAC_BUS_WIDTH-1:0] out_sig_q_reg[NODES-1:0];

integer dstVal,srcVal, tapVal;
//generate
always @(posedge clk) begin: AlwaysSummingForLoop
  for (dstVal=0; dstVal<2; dstVal=dstVal+1) begin:SummingForLoop
    out_sig_i_reg[dstVal] <= 0;
    out_sig_q_reg[dstVal] <= 0;
      for (srcVal=0; srcVal<2; srcVal=srcVal+1) begin:SrcForLoop
        if(srcVal != dstVal) begin:innerIf
             for (tapVal=0; tapVal<8; tapVal=tapVal+1) begin:tapSum
                out_sig_i_reg[dstVal] <= out_sig_i_reg[dstVal] + tap_output_i[srcVal][dstVal][tapVal];
                out_sig_q_reg[dstVal] <= out_sig_q_reg[dstVal] + tap_output_q[srcVal][dstVal][tapVal];
             end
        end
      end
    end
end
//endgenerate
assign out_sig_i[0] = out_sig_i_reg[0];
assign out_sig_q[0] = out_sig_q_reg[0];
assign out_sig_i[1] = out_sig_i_reg[1];
assign out_sig_q[1] = out_sig_q_reg[1];
out_sig_q_reg[dstVal] <= 0;
for (i=0; i<2; i=i+1) begin
  for (j=0; j<8; j=j+1) begin
    out_sig_q_reg[dstVal] <= out_sig_q_reg[dstVal] + tap_output_q[i][dstVal][j];
  end
end
always @* begin
   //..
   out_sig_q[dstVal] = 0;
   for (i=0; i<2; i=i+1) begin
     for (j=0; j<8; j=j+1) begin
       out_sig_q[dstVal] = out_sig_q[dstVal] + tap_output_q[i][dstVal][j];
     end
   end
   //..
 end

always (@posedge clk) begin 
  for ...
    out_sig_q_reg[dstVal] <= out_sig_q[dstVal];