チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

組み合わせ回路とか

新人研修と一時期を除いてしばらく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