Posts Tagged with "Design"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

Cmod A7の利用 (3)

posted by sakurai on October 26, 2023 #686

完成した回路図を図686.1に、レイアウト図を686.2に示します。ボードは仕様的に2層、80cm^2未満であるため、Eagleの無料版で設計することができました。

図%%.1
図686.1 CmodA7toPMODボード回路図

図%%.1
図686.2 CmodA7toPMODボードガーバー図

基板業者JLCPCBにおいて基板製造及び部品実装(PCBA)をオーダーしようと思いました。ところがSMT部品でないとアセンブリできないらしく、今回SMT部品が無いことから基板のみのサービスを利用しました。

表686.1 JLCPCB費用まとめ
内容 費用[USD]
基板製造費10枚 5.00
配送費(OCS) 1.98
合計 6.98

という結果でした。


左矢前のブログ 次のブログ右矢

Cmod A7の利用 (2)

posted by sakurai on October 25, 2023 #685

Eagleライブラリの作成

同様にDC Jackを登録します。以下にその基盤図及び実体図を示します。基盤穴をグレーで塗っています。

図%%.1
図685.1 Cmod A7ボード

EAGLEでこれを登録するには基盤図をfootprintに入力する必要があり、ライブラリを次のように作成します。

(1) symbolの編集画面において、

  • 部品外形をLayer=94 Symbolsで記述。
  • 適宜論理ピンを設定。
  • textでLayer=95 Namesとして">NAME"を追加。
  • textでLayer=96 Valuesとして">VALUE"を追加。

(2) footprintの編集画面において、

  • textでLayer=25 tNamesとして">NAME"を追加。
  • textでLayer=27 tValuesとして">VALUE"を追加。
  • Layer=20 Dimensionとする。
  • Widthを0とする。
  • Gridをmmにする。
  • ラインコマンドをクリックする。
  • 入力窓に、"(x, y)"と点を打つ。

以下"(x, y)"の繰り返しで図形を描きます。"20 Dimension"は外形線ですが、外形線の囲む内部に外形線があれば、囲まれた領域が穴になるという仕様です。ただし、上図は背面から見た図なので、上面から見た図はその裏返しとなります。

さらに、表面から背面に貫通する端子を背面で+5Vと接続させるため、背面のソルダーレジストを禁止とします。そのためには

  • 禁止したい領域をLayer=30 bStopとして矩形で囲む。

(3) deviceの編集画面において、

  • Edit ⇒ Addで作成したsymbolの読み込み
  • Edit ⇒ Packageで作成したfootprintの読み込み
  • 論理ピンと物理ピン(pad)の接続
  • prefixをクリックしてJと入力 (J1, J2, としたい場合)

特にここで挙げたsymbol画面とfootprint画面からのdevice画面への読み込みが直感的ではないので注意してください。


左矢前のブログ 次のブログ右矢

Cmod A7の利用

posted by sakurai on October 24, 2023 #684

Cmod A7

Cmod A7とはDigilentから販売されているArtix 7シリーズのFPGAの評価ボードで、その特長は小さくて安いことにあります。最近の世界的なインフレにより各種FPGAボードが値上がりしている中で、USD 99と最安の部類に入ります。

図%%.1
図684.1 Cmod A7ボード

小さくて安いFPGAボードですが、Arty A7-35ボードと同じFPGAを採用しているため、Space Invadersが動作するはずです。

CmodA7toPMOD

しかしながらArty A7ボードがPMODインタフェースを4個搭載しておりそのままPMOD-VGAやPMOD-Audioボードを接続できるのに対し、このボードはPMODが1個しかないため、PMODインタフェースを設計する必要があります。ただし、Ultra96と異なり端子電圧が3.3VであるためPMODと直接インタフェースでき、レベル変換ICが不要です。

そのためには変換ボード上に

  • Cmod A7ボード
  • PMODピンソケットコネクタ x 4
  • ACアダプタコネクタ(MJ-179PH)
  • 5V-3.3V電圧降下コンバータ(NJU7223F33)

等の部品を搭載する必要があります。

Eagleライブラリの作成

EAGLEでこれらを使用するにはシンボル図や基盤図をライブラリに登録する必要があります。例として電圧降下コンバータNJU7223F33の外形図を図684.2に示します。

図%%.2
図684.2 NJU7223F33外形図

このシンボルとフットプリントを作成した図を以下に示します。

図%%.3
図684.3 NJU7223F33 symbol図

図%%.4
図684.4 NJU7223F33 footprint図

左矢前のブログ 次のブログ右矢

色変換回路 (5)

posted by sakurai on October 23, 2023 #683

BSVフォーラムで議論したところ、以下のような回答を順次頂きました。

  • 最初の一括でリターンを返すメソッドのほうが良い。が、メソッドの構造体を分割する手段は現状のBSVの文法にはない。従って手段としては2つあり、外側にverilogラッパーを設けて分割するか、BSVに新たな機能を追加するか。
  • 組み合わせ回路の関数を置いたらどうか?
  • clockとresetは、インタフェース外の端子を使えば消すことができる。
  • RDYが1にもかかわらずエラーになる件はbscのissueとして登録した。

組み合わせ回路の関数は良い方法だと思うので、今後色変換回路を組み込む場合にはそうしようと思います。

しかしながら今回は外付けのモジュールとしたため、clockとresetを消去する方法で行きたいと思います。提示されたソースは以下のとおり。

interface ColorConverter;
  (* result="RO" *)
  method Bit#(4) getRO();
  (* result="GO" *)
  method Bit#(4) getGO();
  (* result="BO" *)
  method Bit#(4) getBO();
endinterface

(* synthesize, always_ready, no_default_clock, no_default_reset *)
module mkColorConverter(
    (* port="RI" *) Bit#(1) r,
    (* port="GI" *) Bit#(1) g,
    (* port="BI" *) Bit#(1) b,
        ColorConverter ifc);

  method Bit#(4) getRO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h9;
      3'b010: 4'hd;
      3'b011: 4'h5;
      3'b100: 4'hc;
      default: 4'h0;
    endcase);
  endmethod

  method Bit#(4) getGO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h4;
      3'b010: 4'h8;
      3'b011: 4'hb;
      3'b100: 4'hc;
      default: 4'h0;
    endcase);
  endmethod

  method Bit#(4) getBO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h1;
      3'b010: 4'h4;
      3'b011: 4'h5;
      3'b100: 4'hC;
      default: 4'h0;
    endcase);
  endmethod
endmodule

メソッドを用いない入力方法があるようです。具体的にはinterfaceはメソッドを並べるため、interface定義外にポートを定義しています。

また、カラー0は非表示画面も示すため、変換せずに0のままと変更しました。

このソースから生成されるverilogコードはヘッダや定義文を除いて次のとおり。

module mkColorConverter(RI,
            GI,
            BI,
            RO,
            GO,
            BO);
  input  RI;
  input  GI;
  input  BI;

  // value method getRO
  output [3 : 0] RO;
  // value method getGO
  output [3 : 0] GO;
  // value method getBO
  output [3 : 0] BO;

  // signals for module outputs
  reg [3 : 0] BO, GO, RO;
  // remaining internal signals
  wire [2 : 0] x__h151;

  // value method getRO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: RO = 4'h0;
      3'b001: RO = 4'h9;
      3'b010: RO = 4'hD;
      3'b011: RO = 4'h5;
      3'b100: RO = 4'hC;
      default: RO = 4'h0;
    endcase
  end

  // value method getGO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: GO = 4'h0;
      3'b001: GO = 4'h4;
      3'b010: GO = 4'h8;
      3'b011: GO = 4'hB;
      3'b100: GO = 4'hC;
      default: GO = 4'h0;
    endcase
  end

  // value method getBO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: BO = 4'h0;
      3'b001: BO = 4'h1;
      3'b010: BO = 4'h4;
      3'b011: BO = 4'h5;
      3'b100: BO = 4'hC;
      default: BO = 4'h0;
    endcase
  end

  // remaining internal signals
  assign x__h151 = { RI, GI, BI } ;
endmodule  // mkColorConverter

verilogは正しく生成されています。


左矢前のブログ 次のブログ右矢

色変換回路 (4)

posted by sakurai on October 20, 2023 #682

試行錯誤した結果、always_readyは解決しました。WireでなくDWireを用いるとうまく消えることがわかりました。ソースにおいて修正点のみを示すと、

(* synthesize, always_enabled = "setInputs", always_ready = "getRO, getGO, getBO" *)

及び

    Wire#(Bit#(1)) r_reg <- mkDWire(?);
    Wire#(Bit#(1)) g_reg <- mkDWire(?);
    Wire#(Bit#(1)) b_reg <- mkDWire(?);

の2か所を修正するだけです。生成されたverilogはかなりスッキリしてきており、後は未使用のCLK及びRST_Nを削除する方法だけですが、(* no_default_clock, no_default_reset *) とすれば良いようです。

module mkColorConverter(CLK,
            RST_N,
            RI,
            GI,
            BI,
            RO,
            GO,
            BO);
  input  CLK;
  input  RST_N;

  // action method setInputs
  input  RI;
  input  GI;
  input  BI;

  // value method getRO
  output [3 : 0] RO;
  // value method getGO
  output [3 : 0] GO;
  // value method getBO
  output [3 : 0] BO;

  // signals for module outputs
  reg [3 : 0] BO, GO, RO;
  // remaining internal signals
  wire [2 : 0] x__h322;

  // value method getRO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: RO = 4'h9;
      3'b001: RO = 4'hD;
      3'b010: RO = 4'h5;
      default: RO = 4'hC;
    endcase
  end

  // value method getGO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: GO = 4'h4;
      3'b001: GO = 4'h8;
      3'b010: GO = 4'hB;
      default: GO = 4'hC;
    endcase
  end

  // value method getBO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: BO = 4'h1;
      3'b001: BO = 4'h4;
      3'b010: BO = 4'h5;
      default: BO = 4'hC;
    endcase
  end

  // remaining internal signals
  assign x__h322 = { RI, GI, BI } ;
endmodule  // mkColorConverter

左矢前のブログ 次のブログ右矢

色変換回路 (3)

posted by sakurai on October 19, 2023 #681

そもそもリターンメソッド(出力に相当する)が単一なのは、タイミング的に同時に12bitを読みだすからですが、これを4bitずつ3回にわけて読みだす形にします。すると、

interface ColorConverter;
  (* prefix="" *)
  method Action setInputs(
    (* port="RI" *) Bit#(1) r,
    (* port="GI" *) Bit#(1) g,
    (* port="BI" *) Bit#(1) b);
  (* result="RO" *)
  method Bit#(4) getRO();
  (* result="GO" *)
  method Bit#(4) getGO();
  (* result="BO" *)
  method Bit#(4) getBO();
endinterface

(* synthesize, always_enabled = "setInputs" *)
module mkColorConverter(ColorConverter);
    Wire#(Bit#(1)) r_reg <- mkWire;
    Wire#(Bit#(1)) g_reg <- mkWire;
    Wire#(Bit#(1)) b_reg <- mkWire;

  method Action setInputs(Bit#(1) r, Bit#(1) g, Bit#(1) b);
    r_reg <= r;
    g_reg <= g;
    b_reg <= b;
  endmethod

  method Bit#(4) getRO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h9;
      3'b001: 4'hD;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod

  method Bit#(4) getGO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h4;
      3'b001: 4'h8;
      3'b010: 4'hB;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod

  method Bit#(4) getBO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h1;
      3'b001: 4'h4;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod
endmodule

このソースからは以下のverilogが生成されます。

module mkColorConverter(CLK,
            RST_N,
            RI,
            GI,
            BI,
            RO,
            RDY_getRO,
            GO,
            RDY_getGO,
            BO,
            RDY_getBO);
  input  CLK;
  input  RST_N;
  // action method setInputs
  input  RI;
  input  GI;
  input  BI;
  // value method getRO
  output [3 : 0] RO;
  output RDY_getRO;
  // value method getGO
  output [3 : 0] GO;
  output RDY_getGO;
  // value method getBO
  output [3 : 0] BO;
  output RDY_getBO;
  // signals for module outputs
  reg [3 : 0] BO, GO, RO;
  wire RDY_getBO, RDY_getGO, RDY_getRO;
  // remaining internal signals
  wire [2 : 0] x__h322;
  // value method getRO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: RO = 4'h9;
      3'b001: RO = 4'hD;
      3'b010: RO = 4'h5;
      default: RO = 4'hC;
    endcase
  end
  assign RDY_getRO = 1'b1 ;
  // value method getGO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: GO = 4'h4;
      3'b001: GO = 4'h8;
      3'b010: GO = 4'hB;
      default: GO = 4'hC;
    endcase
  end
  assign RDY_getGO = 1'b1 ;
  // value method getBO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: BO = 4'h1;
      3'b001: BO = 4'h4;
      3'b010: BO = 4'h5;
      default: BO = 4'hC;
    endcase
  end
  assign RDY_getBO = 1'b1 ;
  // remaining internal signals
  assign x__h322 = { RI, GI, BI } ;
endmodule  // mkColorConverter

出力ポートの形は狙い通り4bit×3個となりました。しかしながら、問題点は生成されたコメントにもあるように、

// Ports:                                                                   
// Name                         I/O  size props                             
// RO                             O     4                                   
// RDY_getRO                      O     1 const                             
// GO                             O     4                                   
// RDY_getGO                      O     1 const                             
// BO                             O     4                                   
// RDY_getBO                      O     1 const                             
// CLK                            I     1 unused                            
// RST_N                          I     1 unused                            
// RI                             I     1                                   
// GI                             I     1         
  1. RDY信号が定数でalways_readyを示す
  2. CLK, RST_Nが未使用

であることから両者とも削除可能です。入力のenableは always_enabled = "setInputs" で示すように削除することができたのですが、always_readyを指定してもエラーとなり、RDY信号を削除することができませんでした。

さらに、no_default_clock, no_default_reset によりCLKとRST_Nを削除できる場合もあるようですが、この場合はエラーが発生してできませんでした。この2点が疑問です。


左矢前のブログ 次のブログ右矢

色変換回路 (2)

posted by sakurai on October 18, 2023 #680

このソースから生成されたverilogファイルは以下のようになります。先頭のコメントやifdef文等を省略したソースを示します。

module mkColorConverter(RI,
            GI,
            BI,
            OUT);
  // value method mapColor
  input  RI;
  input  GI;
  input  BI;
  output [11 : 0] OUT;

  // signals for module outputs
  reg [11 : 0] OUT;

  // remaining internal signals
  wire [2 : 0] x__h134;

  // value method mapColor
  always@(x__h134)
  begin
    case (x__h134)
      3'b0: OUT = 12'd2369;
      3'b001: OUT = 12'd3460;
      3'b010: OUT = 12'd1461;
      default: OUT = 12'd3276;
    endcase
  end

  // remaining internal signals
  assign x__h134 = { RI, GI, BI } ;
endmodule  // mkColorConverter

図%%.1
図680.1 色変換回路

問題は以下のようにstructで3つのデータを構造化しているにも関わらず、12ビット出力ポートが1個生成されてしまうことです。構造体メンバを取り出す方法がありません。

typedef struct {
  Bit#(4) ro;
  Bit#(4) go;
  Bit#(4) bo;
} ColorOutputs deriving (Bits);

これを4bitの3つの出力ポートとしたいわけです。

不思議なことにBSVの世界から離れてverilogだけでなんとかしようとして手修正によりポートを3つに分けてみたのですが、思ったようにはなりませんでした。例えばverilogを

module mkColorConverter(RI,
                    GI,
                    BI,
                    RO,
                    GO,
                    BO);
  // value method mapColor
  input  RI;
  input  GI;
  input  BI;
  output [3 : 0] RO;
  output [3 : 0] GO;
  output [3 : 0] BO;

  // signals for module outputs
  wire [3 : 0] RO = OUT[11:8];
  wire [3 : 0] GO = OUT[7:4];
  wire [3 : 0] BO = OUT[3:0];
  reg [11: 0] OUT;

のように手修正しても、以下の図のような回路となってしまいました。ポート名は良いのですが、ポート番号が思ったように付いてくれません。

図%%.2
図680.2 色変換回路

いちいち手修正するのも嫌なので、BSVで可能な方法を探ります。


左矢前のブログ 次のブログ右矢

色変換回路

posted by sakurai on October 17, 2023 #679

単なる組み合わせ回路による拾変換回路についてかなりトラブルが有ったので、備忘のために記します。

まず、設計したい色変換回路は以下のようなものです。入力はRI, GI, BIのそれぞれ1ビット、出力はRO[3:0]、GO[3:0]、BO[3:0]の3 * 4ビットの回路です。原色を中間色に変換する、2^12(=4096)色中の2^3(=8)色を表示する固定カラーパレットとも言えます。

図%%.1
図679.1 色変換回路

最初に次のようなプログラムをChatGPTの助けを借りて作成しました。

typedef struct {
  Bit#(4) ro;
  Bit#(4) go;
  Bit#(4) bo;
} ColorOutputs deriving (Bits);

interface ColorConverter;
  (* result="OUT" *)
  (* prefix="" *)
  method ColorOutputs mapColor(
    (* port="RI" *) Bit#(1) r,
    (* port="GI" *) Bit#(1) g,
    (* port="BI" *) Bit#(1) b);
endinterface

(* synthesize, always_ready = "mapColor", no_default_clock, no_default_reset *)
module mkColorConverter(ColorConverter);
  method ColorOutputs mapColor(Bit#(1) r, Bit#(1) g, Bit#(1) b);
    Bit#(4) ro = (case ({r, g, b})
      3'b000: 4'h9;
      3'b001: 4'hD;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);

    Bit#(4) go = (case ({r, g, b})
      3'b000: 4'h4;
      3'b001: 4'h8;
      3'b010: 4'hB;
      3'b100: 4'hC;
      default: ?;
    endcase);

    Bit#(4) bo = (case ({r, g, b})
      3'b000: 4'h1;
      3'b001: 4'h4;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);

    return ColorOutputs {ro: ro, go: go, bo: bo};
  endmethod
endmodule

左矢前のブログ 次のブログ右矢

posted by sakurai on October 12, 2023 #677

次に、下位モジュールにおいて、入力信号をレジスタ受けではなく、ワイヤ受けに変更します。以下に修正部分のみを示します。

Processor.bsv:

     Reg#(Bool) if_wait <- mkWire;
     Reg#(Bool) mc_wait <- mkWire;
     Reg#(Bool) ex_wait <- mkWire;
     Reg#(Bool) ma_wait <- mkWire;

この場合は上位がRegisterですが、下位はWireであるため、図677.1に示すようにwait信号は遅れません。上位で変化したサイクルでそのまま下位に伝わります。

図%%.1
図677.1 ウエイト伝播

前稿でも同様ですが、上位ではサイクル毎に下位にwait信号を伝えるルールを記述しています。

Tb.bsv:

    rule load_wait_values;
        proc.if_wait_load(if_wait);
        proc.mc_wait_load(mc_wait);
        proc.ex_wait_load(ex_wait);
        proc.ma_wait_load(ma_wait);
    endrule

左矢前のブログ 次のブログ右矢

posted by sakurai on October 11, 2023 #676

モジュール内でデータを受け取るにはRegisterを設置する方法とWireを設置する方法があります。パイプラインプロセッサのwait信号を例にして、2つの違いを見てみます。

まず、Test-benchにおいてRegisterを設置するのは共通とします。例えば、

Tb.bsv:

import StmtFSM::*;
import Processor::*;

(* synthesize *)
module mkTb();
    Processor_ifc proc <- mkProcessor();
    Reg#(Bool) if_wait <- mkReg(True);
    Reg#(Bool) mc_wait <- mkReg(True);
    Reg#(Bool) ex_wait <- mkReg(True);
    Reg#(Bool) ma_wait <- mkReg(True);

    rule load_wait_values;
        proc.if_wait_load(if_wait);
        proc.mc_wait_load(mc_wait);
        proc.ex_wait_load(ex_wait);
        proc.ma_wait_load(ma_wait);
    endrule

    Stmt main = seq
        action
            if_wait <= False;
            mc_wait <= False;
            ex_wait <= False;
            ma_wait <= False;
        endaction
        delay(4);
        if_wait <= True;
        delay(0);
        if_wait <= False;
        delay(4);

(中略)

        $finish;
    endseq;
    mkAutoFSM(main);

endmodule

であり、下位のモジュールが、

Processor.bsv:

import FIFO::*;

interface Processor_ifc;
    (* prefix="" *)
    method Action if_wait_load(Bool in_if_wait);
    method Action mc_wait_load(Bool in_mc_wait);
    method Action ex_wait_load(Bool in_ex_wait);
    method Action ma_wait_load(Bool in_ma_wait);
endinterface

(* synthesize, always_ready *)
module mkProcessor(Processor_ifc);

    Reg#(int) pc <- mkReg(0);
    FIFO#(Maybe#(int)) ifs <- mkLFIFO;
    FIFO#(Maybe#(int)) ids <- mkLFIFO;
    FIFO#(Maybe#(int)) exs <- mkLFIFO;
    FIFO#(Maybe#(int)) mas <- mkLFIFO;
    FIFO#(Maybe#(int)) wbs <- mkLFIFO;
    Reg#(Bool) if_wait <- mkReg(False);
    Reg#(Bool) mc_wait <- mkReg(False);
    Reg#(Bool) ex_wait <- mkReg(False);
    Reg#(Bool) ma_wait <- mkReg(False);

    // <PC>
    rule pc_stage;
        if (pc > 100) $finish(0);
        $display("------");
        ifs.enq(tagged Valid pc);
        pc <= pc + 4;
    endrule

    // <IF>
    rule if_stage;
        let pc_if = ifs.first;
        if (!if_wait) begin
            ifs.deq;
            $display (" pc_if = %04h", pc_if);
            ids.enq (pc_if);
        end else begin
            ids.enq (tagged Invalid);
        end
    endrule

    // <ID>
    rule id_stage;
        let pc_id = ids.first;
        if (!mc_wait) begin
            ids.deq;
            $display (" pc_id = %04h", pc_id);
            exs.enq (pc_id);
        end else begin
            exs.enq (tagged Invalid);
        end
    endrule

    // <EX>
    rule ex_stage;
        let pc_ex = exs.first;
        if (!ex_wait) begin
            exs.deq;
            $display (" pc_ex = %04h", pc_ex);
            mas.enq (pc_ex);
        end else begin
            mas.enq (tagged Invalid);
        end
    endrule

    // <MA>
    rule ma_stage;
        let pc_ma = mas.first;
        if (!ma_wait) begin
            mas.deq;
            $display (" pc_ma = %04h", pc_ma);
            wbs.enq (pc_ma);
        end else begin
            wbs.enq (tagged Invalid);
        end
    endrule

    // <WB>
    rule wb_stage;
        let pc_wb = wbs.first;
        wbs.deq;
        $display (" pc_wb = %04h", pc_wb);
    endrule

    method Action if_wait_load(Bool in_if_wait);
        if_wait <= in_if_wait;
    endmethod
    method Action mc_wait_load(Bool in_mc_wait);
        mc_wait <= in_mc_wait;
    endmethod
    method Action ex_wait_load(Bool in_ex_wait);
        ex_wait <= in_ex_wait;
    endmethod
    method Action ma_wait_load(Bool in_ma_wait);
        ma_wait <= in_ma_wait;
    endmethod

endmodule: mkProcessor

この場合は上位がレジスタであり、下位もレジスタであるため、信号の伝播が1サイクル遅れます。

図%%.1
図676.1 ウエイト伝播

左矢前のブログ 次のブログ右矢


ページ: