論理回路デザイン
ArchiTek home page
結合

単純な結合方式サンプルRTL

単純な結合方式
  • 必要十分条件(NASC)が真であれば、結合後のoVldを全てアサートし、結合前のiStallを全てデアサート。
  • iStalliには自らのiVldiが関わるため、前段ステージにバッファ型(S?以外のものを用いると、iVldi永遠にデアサート状態となり機能しない。
  • oVldiには自らのoStalliが関わるため、後段ステージにスループット制御を行う入力制御タイプを用いると、ループした組み合わせ回路[3]が発生。
    
    module node(iVld, iStall, oVld, oStall);
            parameter       N       = 4;
            parameter       M       = 4;

            input   [N-1:0] iVld;
            output  [N-1:0] iStall;
            output  [M-1:0] oVld;
            input   [M-1:0] oStall;
    
            wire            nasc    = (&iVld) & (~|oStall);
    
            assign iStall   = {N{~nasc}};
            assign oVld     = {M{nasc}};
    endmodule
          

一般的な結合方式サンプルRTL

一般的な結合方式
  • 必要十分条件(NASC)が真であれば、結合後のoVldを以下の条件でアサートし、結合前のiStallを以下の条件でデアサート。
    • iStalliには自らのiVldiの関与を排除
    • oVldiには自らのoStalliの関与を排除
  • この条件下でも、後段ステージにスループット制御を行う入力制御タイプ複数用いると、ループした組み合わせ回路[3]が発生。
    
    module node(iVld, iStall, oVld, oStall);
            parameter       P       = 2;
            parameter       Q       = 2;
            parameter       M       = 1<<P;
            parameter       N       = 1<<Q

            input   [N-1:0] iVld;
            output  [N-1:0] iStall;
            output  [M-1:0] oVld;
            input   [M-1:0] oStall;
    
            reg     [N-1:0] iStall;
            reg     [M-1:0] oVld;
            
            integer         i;

    always @(iVld or oStall)
            for (i=0; i<N; i=i+1)
                    iStall  = ~&vldSerFunc(iVld, i) | (|oStall);

    always @(iVld or oStall)
            for (i=0; i<M; i=i+1)
                    oVld    = &iVld & (~|StallSerFunc(oStall, i));

    function [N-1:0] vldSerFunc;
            input   [N-1:0] vld;
            input   [Q-1:0] num;
            integer         i;
    
            for (i=0; i<N; i=i+1)
                    vldSerFunc[i]   = (i == num) ? 1'b1 : vld[i];
    endfunction
    
    function [M-1:0] StallSerFunc;
            input   [M-1:0] Stall;
            input   [P-1:0] num;
            integer         i;
    
            for (i=0; i<M; i=i+1)
                    StallSerFunc[i]   = (i == num) ? 1'b0 : Stall[i];
    endfunction
    endmodule
          

回路デザイン > パイプライン > 結合    次のページ(スループット制御)   このページのTOP ▲

[1]
統計は取っていませんが、最も不具合の発生する箇所だと思います。

経験上、めったにアサートすることのないStallを記述し忘れることが一番恐ろしいケースになります。モジュール組み立て後のテストになるため、Stallを恣意的にアサートしにくく、多くの場合すり抜けてしまうことが原因です。

こうなると、LSIにしてから極まれにエラーを発生させ、原因究明から対策まで大変な目に合うことは確実です。細心の注意を払って下さい。
[2]
結合部で入力信号(結合数-1)と出力信号(1)の合計が結合数になっていることを確認すれば大抵のミスは防げます。

さらに、終了条件等の信号がValid, Stallに加わる場合です。条件を入れたValidとStallで論理が組まれているかも確認して下さい。

ステートマシンの終了状態において、開始信号等の考慮を忘れ無条件でIDLE状態に遷移するなどのミスも類似的な問題です(状態はIDLEだが開始信号は受領されたなど)。
[3]
論理合成ツールによっては、組み合わせ回路ループのメッセージが出ないかもしれません。回避のため、ベクターをバラして変数を完全排除して記述しなければならない状況もあります。