組み合わせ回路とか
新人研修と一時期を除いてしばらくVerilogを書いておらず、最近は雰囲気だけで読んでいたところもあって、SystemCの本だけでは行き詰まるところが出てきた。 すこしVerilogの復習をしておく。とりあえずcounter回路をモチーフにVCS,Verdiの環境を作っておいた。
演算子
比較演算子
== | != | === | !== |
---|---|---|---|
x,zを含む場合、xを返す | x,zを含む場合、xを返す | x,zを含めて一致していればtrue | x,zを含めて不一致していればtrue |
合成可 | 合成可 | 合成不可 | 合成不可 |
==と===があって、前者は'x','z'を考慮せず、一致不一致を返す。比較対象に'x,'z'が含まれる場合は不定値'x'を返す。後者は'x','z'を含めた比較結果を返す。
論理シフトと算術シフト
<< | >> | <<< | >>> |
---|---|---|---|
論理右シフト | 論理左シフト | 算術右シフト | 算術左シフト |
基本的には同じだが、負数の時の右シフトの結果が異なる。
8'sb1100_1010 >> 2 = 8'sb0011_0010 // 単純に2bit右シフト 8'sb1100_1010 >>> 2 = 8'sb1111_0010 // 符号ビットが保存される // -54 >> 2 = -14
3項演算子
(条件) ? (true処理) : (false処理)
条件節をORリダクションした結果が判定される。1bitでも1があれば、true節に落ちる。
モジュールの構造
module モジュール名(ポートリスト); // ポート宣言 input 入力信号名; output 出力信号名; // 内部信号定義 wire 内部信号名; reg 内部信号名; // 回路記述 endmodule
- ポートリストには入出力信号名をすべて記載する。ポート宣言と順序を合わせる必要はない
- initial文は論理合成対象外
assign文
継続的代入文。右辺に含まれる信号が変化すると、即時式が評価されて、左辺が更新される。普通のプログラムでは上から順々に実行されるが、assign文の実行順序は記述順序に依存しない。
function
- 組み合わせ回路の記述に使用する
- functionは1cycle処理になる
- 出力信号(戻り値)は1つだけ
- functionの中身の代入は"="でOK
- functionの有効範囲(スコープ)は宣言したmoduleの中だけ
簡単なセレクタ回路。
module selector(in0, in1, sel, out); input [3:0] in0; input [3:0] in1; input sel; output [3:0] out; // function function [3:0] select; input [3:0] in0; input [3:0] in1; input sel; begin if(sel) select = in1; else select = in0; end endfunction // call function assign out = select(in0,in1,sel); endmodule