【问题标题】:Verilog for loop failed to synthesis using oasysVerilog for 循环无法使用 oasys 进行综合
【发布时间】:2020-04-23 16:43:33
【问题描述】:

我不知道为什么这段代码使用 oasys 工具合成失败

 for (i = 0; i < N; i = i + 1) begin
          if( i >= counter & i < new_pos)
            out[i] <= bit;
        end

其中 counter,out 是 reg 而 new_pos 是 wire 对于下面提供的完整代码模块

module decompressor #(parameter N = 32)(clk ,  reset , start , bit , value 
 , store , out);
  input clk,reset,start,bit; // start decompress , bit is the value to be 
  added
  input [$clog2(N):0] value; // value is counter for the decoded bit
  output reg store;  // Store to acknwoledge memory manager
 output reg[N-1:0]out;  // out is decoded data
  reg [$clog2(N) - 1:0] counter,counter2; // counter for number of 
 decompressed bits
 wire [$clog2 (N) + 1:0] new_pos , remain , new_value , temp ,full; // 
new_pos is new counter after decompress & remain number of uncompressed 
 bits
  reg next; // finished decompressing
 wire work ;  // Haven't finished decompressing
  integer i;  // used in for loop

  assign full = N;

  adder #($clog2 (N) + 1) add1(new_value , {2'b00 ,counter2} , new_pos);
 sub #($clog2 (N) + 1) sub1(full , {2'b00 , counter2} , remain);
 sub #($clog2 (N) + 1) sub2({1'b0,value} , remain , temp);

 assign new_value = (start == 1)? {1'b0,value} : temp;
 assign work = (~next) | start;

 always @( posedge clk , reset)begin
   if(reset == 1'b1)begin
    counter <= 0;
    counter2 <= 0;
    next <= 0;
  end else if(work == 1'b1) begin
    if( new_pos <= N )begin
      for (i = 0; i < N; i = i + 1) begin
          if( i >= counter & i < new_pos)
            out[i] <= bit;
        end
      counter <= new_pos[$clog2(N) - 1:0]; 
      next <= 1'b1;
      if( new_pos ==  N)begin 
        store <= 1'b1;
      end else begin
        store <= 1'b0;
      end
    end else begin
      for (i = 0; i < N; i = i + 1) begin
          if( i >= counter )
            out[i] <= bit;
        end
      counter <= 0;
      next <= 0;
      store <= 1'b1;
    end   
  end else 
    store <= 1'b0;
end

always @(negedge clk)begin
if( reset == 1'b0) 
  counter2 <= counter;
end

结束模块

【问题讨论】:

  • 请提供一个完整的示例,以及有关失败的更多上下文。
  • @DavidShah 提供的完整模块有问题
  • 您没有告诉我们错误是什么或为什么它不合成。顺便说一句,你确定if( i &gt;= counter &amp; i &lt; new_pos) 还是你的意思是if( i &gt;= counter &amp;&amp; i &lt; new_pos)
  • 在这种情况下它们的行为相同 & / && 该工具只是告诉我无法合成而没有进一步的细节。但最有可能是由于 for 循环而失败
  • 综合工具告诉你什么?

标签: for-loop verilog synthesis hardware-programming


【解决方案1】:

always @( posedge clk , reset) 不是有效的综合事件列表。试试always @(posedge clk, posedge reset)

【讨论】:

  • 是的,一旦我修复它,它似乎很好。
  • 是的,这有帮助,但 for 循环也被替换为 for generate 并带有多路复用器以通过合成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多