前回は、論理圧縮ツール Espresso を使うことができる LogicFriday を試してみました。今回は再びLogicsimへ戻ります。しかし後々のこと(なんだそれ)を考えるとライブラリがVerilogでも書けた方が安心。ということでVerilog化始めました。まずは組み合わせ回路、コンパレータから。
※かえらざるMOS回路 投稿順 INDEX
※使用させていただいとります「フリー」ツールのホームページへのリンクは以下です。
-
- 画面上でゲートレベルの論理回路動作が会話的に観察できるツール
上記からダウンロードして実行可能ですが、開発は既に “suspended indefinitely” 状態です。
-
- 「フリー」のVerilogといったらこれかと
-
- Verilog処理系などが出力する VCDフォーマットのファイルをタイミングチャートとしてみるためのビューワーです。
Verilog化してみるLogicSimのライブラリ
今回やってみるのはロジックの comparator です。2つの数値を比較して大小、イコールを判定するもの。大小の判定まで含めるよりもイコール判定のみの方が回路規模が小さいので実用的に応用が多いかと。
-
- 入力は左辺に、任意のビット数に指定可能
- 出力は右辺に、「大なり」、「イコール」、「小なり」 の3線
- タイミングを持たない組み合わせ回路である
- 入力の数値は符号無整数、符号付き(2の補数)整数を選択可能
今回は、とりあえず 8ビット入力、符号無にてVerilog化してみたいと思います。LogicSim上で「大なり」が出力されているところが以下に。
「イコール」は冒頭のアイキャッチ画像に。以下は「小なり」のときです。LogicSimは、画面の上でクリクリやっていけば論理が動くので、頭に靄のかかった年寄りにも動作が分かり易いです。しかし、如何せんシミュレータとしては使いずらいところがあります。
なお、コンパレータブロックの属性を開くと以下のような感じです。Data Bitsでビット幅を指定し、Numeric Typeで、符号無か2の補数(符号付き)かを選びます。
Verilogで書いてみた
組み合わせ回路を以下のように書いてみました。こんなんでいいのかな~?
/** @file 8bit 2 input comparator, unsigend */ `ifndef COMPU8_V_ `define COMPU8_V_ /** The COMP module @param[in] A [7:0] input @param[in] B [7:0] input @param[out] GT A>B @param[out] EQ A==B @param[out] LT A<B */ module compU8( A, B, GT, EQ, LT ); input [7:0] A, B; output GT, EQ, LT; assign GT = (A > B) ? 1'b1: 1'b0; assign LT = (A < B) ? 1'b1: 1'b0; assign EQ = (A == B); endmodule `endif // COMPU8_V_
上記のコンパレータ回路のテストベンチが以下に。前回、テストベンチの遅延の付け方を間違っていたので(どうせ組み合わせ回路なので違っても問題ない、というお気楽さで前回分は直してないです。すみません。)直しました。もともとあやふやな記憶だし。。。
/** @file testBench.v, to test compU8.v (8 bit comparator, unsigned) */ `ifndef TESTBENCH_V_ `define TESTBENCH_V_ `timescale 1 us / 100 ns /** The compU8 testbench */ module compU8_tb; reg [7:0] A, B; wire GT, EQ, LT; parameter STEP = 10; compU8 dut( A, B, GT, EQ, LT ); initial begin $dumpfile("compU8.vcd"); $dumpvars(-1, dut); $monitor("%d GT=%b, EQ=%b, LT=%b", $stime, GT, EQ, LT); end // testbench actions initial begin #0 A = 8'b00000001; B = 8'b00001000; #STEP A = 8'b00000010; #STEP A = 8'b00000100; #STEP A = 8'b00001000; #STEP A = 8'b00010000; #STEP A = 8'b00100000; #STEP A = 8'b01000000; #STEP A = 8'b10000000; #STEP A = 8'b00000000; B = 8'b00000000; $finish; end endmodule `endif // TESTBENCH_V_
実行してみた
icarus verilogで「エラボレーション」して「シミュレーション」するには以下です。
$ iverilog -o tb.out testBench.v compU8.v $ vvp tb.out
シミュレーション時に$monitorにより表示される実行結果は以下です。まず「小なり」LTで始まって、「イコール」EQになり、「大なり」GTになった後、EQに戻って停止します。一応、目論見通りかね。
波形ビューワーで観察するためのコマンドラインは以下です。
$ gtkwave compU8.vcd
波形ビューワーの画面が以下に。
Verilogのリハビリのためにも、ライブラリを端からVerilog化してみますか。まずは符号付きの処理か、メンドイ感じがする。ホントか。