
前回、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信号がハイになっているみたい。ここは予定通りっと。
自前の「RTLソース」をブロックデザインに取り込む
方法は簡単、まずはブロックデザインを開いて、どこか隙間で右クリックすると「いつもの」メニューがでてきます。各種のIPを配置するときは「Add IP」でしたがその下に「Add Module」というメニューあり。今回はそれです。
「Add Module」を押すと現れるウインドウが以下に。プロジェクト内に多数のRTLソースが定義されていれば、沢山リストされるのでしょうが、今回は一つしか作ってありませぬ。こんな感じね。
上記の odd_parity.v を選択してOKすれば、ほれこのように。
赤丸のところにodd_parity_0という「インスタンス」が現れました。その中央には燦然と「RTL」というマークが。やったね。簡単。
でもな~、このままじゃコアと接続する方法が。。。それはまた次回ってか。
