帰らざるMOS回路(80) Xilinx Vivado、RISC-Vの横にmyRTLブロック

Joseph Halfmoon

前回、RISC-V(MicroBlaze-V)コアのタイミングエラー問題が解決(よく分かってないけど)したみたい。そこで今回からコアの横に「自前の回路」を並べていきたいと思います。自前の回路はRTL(とりあえずVerilogね)記述としましたが、これをRISC-Vコアのお隣に置くのはどうしたらよかですか?やってみます。

※かえらざるMOS回路 投稿順 INDEX

※実習にはWindows11上の AMD社 (Xilinx) Vivado 2024.1 および Viris 2024.1 を使用させていただいております。

※ターゲットボードは、Digilent製 Cmod S7ボードです。お求めやすい? Spartan-7搭載の超小型開発ボードです。

自前のRTLコードをどこに置く?

過去回では、RISC-Vコアを含むブロックデザインの「ラッパ」のソースに手動で手を入れて自前のRTL記述を突っ込んだりしてました。それでも回路は構成可能ですが、自動生成されるラッパのソースに手をいれるので、以降のラッパの自動生成はできなくなるはず。あまり座りごごちの良いもんじゃござんせん。

どちらかと言えば、ブロックデザインの内部に「自前のブロック」を配置してその中に自前のRTLコードが入る形の方が良い感じです。さてこのようにするにはどしたら良いの?充実のXilinx社のドキュメントなので、探せばすぐにお答えが見つかります。日本語ドキュメントへのリンクが以下です。

Vivado Design Suite ユーザー ガイド: IP インテグレーターを使用した IP サブシステムの設計 (UG994)

上記の文書の中に、「ブロック デザインへの RTL モジュールの追加」について述べている部分があります。文書を読めば「簡単そう」ではあるのだけれども大丈夫か?

とりあえず組み込んでみる「自前の」RTLコード

なるべく簡単なもの、ということで用意したのが以下です。8ビットデータについて奇数パリティを計算するだけのもの。実質たったの1行、バリバリの組み合わせ回路っす。

module odd_parity(
    input [7:0] DIN,
    output ODD
    );
    assign ODD = ^DIN;
endmodule
一応論理シミュレーション(ビヘイビア)

既存のブロックデザインの横にRTLソースを並べておきました。普通にシミュレーションしようとするとブロックデザインの方がトップモジュールに見えてしまうので、以下のような小手先のインスタンス化で「今回着目の」パリティ生成回路の方が見やすくなるようにしてみました。シミュレーション用のテスト・ベンチのソースが以下に。

module odd_parity_tb(

    );
  reg clk;
  reg rst;
  reg [7:0] data_in;
  wire parity;

  odd_parity dut (
    .DIN(data_in),
    .ODD(parity)
  );
  
  mv5_CLK100_1_wrapper dut2 (
    .reset(rst),
    .sys_clock(clk)
  );

  always #5 clk = ~clk;

  initial begin
            clk = 0; rst = 0; data_in = 8'b00000000;
    #10;    data_in = 8'b00000001;
    #10;    data_in = 8'b00000101;
    #10;    data_in = 8'b11111110;
    #10;    data_in = 8'b11111111;
    #10;    data_in = 8'b01010010;
    $finish;
  end

endmodule

上記の手抜きなシミュレーションの結果が以下に。一応、入力値が奇数の時だけparity信号がハイになっているみたい。ここは予定通りっと。ODD_PARITY_SIM

自前の「RTLソース」をブロックデザインに取り込む

方法は簡単、まずはブロックデザインを開いて、どこか隙間で右クリックすると「いつもの」メニューがでてきます。各種のIPを配置するときは「Add IP」でしたがその下に「Add Module」というメニューあり。今回はそれです。AddModule

「Add Module」を押すと現れるウインドウが以下に。プロジェクト内に多数のRTLソースが定義されていれば、沢山リストされるのでしょうが、今回は一つしか作ってありませぬ。こんな感じね。AddModule1

上記の odd_parity.v を選択してOKすれば、ほれこのように。

RTLmodule

赤丸のところにodd_parity_0という「インスタンス」が現れました。その中央には燦然と「RTL」というマークが。やったね。簡単。

でもな~、このままじゃコアと接続する方法が。。。それはまた次回ってか。

帰らざるMOS回路(79) Xilinx Vivado、RISC-V、100MHzならOK へ戻る