2017年7月18日火曜日

Vivado CASE文の不具合 調査中

どうやら 
”メモリを推定する記述の場合に不具合が出る”
ようです。

■サンプル1 2bitGCC
reg [1:0] gcc
    always @ (posedge CLK or posedge RST) begin
        if (RST) gcc <= 0;
        else
          case (gcc)
            0 : gcc <= 1;
            1 : gcc <= 3;
            3 : gcc <= 2;
            2 : gcc <= 0;
            default : gcc <= 0;
          endcase

2bitのカウンタ(GrayCode)をcase文で記述。結果RTL記述より2個多い、4bit分のレジスタが合成された
これに対しては、前回に書いたように、
Gray2Bin→+1→Bin2Gray→Reg
の回路を記述すれば最小構成で合成される。

■サンプル2 4input RoundRobinArbiter

    reg [3:0] timeout_counter;
    reg [2:0] sequence;
    wire timeout;

always @ (posedge CLK or posedge RST) begin
      if (RST) sequence <= 0;
      else begin
        case (sequence)
          0 : if (REQUEST1) sequence <= 1;
              else if(REQUEST2) sequence <= 2;
              else if(REQUEST3) sequence <= 3;
              else if(REQUEST4) sequence <= 4;
          1 : if (!REQUEST1 || timeout) begin
                if(REQUEST2) sequence <= 2;
                else if(REQUEST3) sequence <= 3;
                else if(REQUEST4) sequence <= 4;
                else if (REQUEST1) sequence <= 1;
                else sequence <= 0;
              end
          2 : if (!REQUEST2 || timeout) begin
                  if(REQUEST3) sequence <= 3;
                  else if(REQUEST4) sequence <= 4;
                  else if(REQUEST1) sequence <= 1;
                  else if (REQUEST2) sequence <= 2;
                  else sequence <= 0;
                end
          3 : if (!REQUEST3 || timeout) begin
                  中略
                end
          4 : if (!REQUEST4 || timeout) begin
                  中略
                end                    
          default : sequence <= 0;
        endcase
      end
    end
 
    assign GRANT1 = (sequence == 1);
中略
 
    //timeout counter
    always @ (posedge CLK or posedge RST) begin
      if (RST) timeout_counter <= 0;
      else begin
        if (sequence == 0) timeout_counter <= 0;
        else timeout_counter <= timeout_counter+1'b1;
      end
    end
    assign timeout = (timeout_counter == 4'hf);

4bitのタイムアウトカウンタと3bitシーケンス制御用レジを記述。結果はRTL記述と同じ7個のレジスタが合成された。
シーケンサの記述に関しては問題なさそうです。

■おまけ ラウンドロビンの配置結果
レジスタ7個に対しLUTが22個なので、このようにスカスカ。記述を工夫すれば詰められそうですが・・ 

0 件のコメント:

コメントを投稿