□言語設計/論理シミュレーション
◎論理シミュレーション
◆概念
_◇イベントドリブン
Event Driven
回路の中で0ー>1のような信号が変化したイベントをトリガにシミュレータが評価を行い信号を伝播させる方式。イベントの発生しているコンポーネントだけを対象にするので高速。デジタルシミュレータ向き
※動作
①ゲート入力の信号変化
②ゲート論理に基づいて出力を計算
③結果値を指定した時間が経過した後に変化するようにスケジュール
⇒イベントはタイミング・ホイール(Timing Wheel)に記録される
④特定時刻のイベント処理終了したらホイールを回して次の時刻の処理を行う
⇒ゲートの出力が変化する前に入力が変化し、異なる出力が得られた場合には、前のスケジュールを取消、新値を再スケジュール
_◇タイムステップドリブン
すべてのコンポーネントについて時間軸で評価(積分)を行う。アナログシミュレータ向き。
_◇動作記述
概念的な回路動作が対象。タイミングや回路内のふるまいは記述しない。
_◇ビヘイビュア
クロックの概念無し
_◇RTL
Register Transfer Level
レジスタ①やクロックを明確に定義
回路の振る舞いや信号フローを記述するがタイミングは記述しない。
※RTL クロック有り
※RTL記述に含まれてよい項目
①サイクル内の機能動作
②状態間の遷移
③ストレージ素子
④状態、サイクル内の演算
⑤論理ブール式
⑥テクノロジ依存ネットリスト
⑦入出力信号、内部信号
_◇ゲートレベル
デジタル的なタイミングまで考慮する。
_◇トランジスタ
回路をトランジスタで記述し、アナログ的に評価する。
_◇ダイナミックタイミングシミュレータ
混在シミュレーション用にSPICEに近い精度ながら数100倍の速度でシミュレーションができるもの
◆遅延のモデリング
_◇慣性遅延
物理的な遅延。積分回路的動作。
ある遅延時間より短いパルスは出力に出ない
ある遅延時間より長いパルスは遅延時間分送れて出力される
_◇伝搬遅延
物理的な遅延。
_◇デルタ遅延
シミュレーションなどのイベント処理用仮想遅延。
遅延時間的には0に見えるが、実はその中に順序をつけるためのもの
◆論理値とストレングス
_◇論理値
通常
真を論理値1
偽を論理値0
※不定値 X
不定値は論理0,1、Zのいずれと競合してもX
①電源投入後の初期化状態
⇒実デバイスで、電源投入後の状態は0か1か偶然による
②異なる論理値の競合
⇒通常のCMOS回路ではないが
※ハイインピーダンス Z
ハイインピーダンスは、論理0,1、Xのいずれと競合しても相手の値となる
①スリーステートゲート、トランスミッションゲート
⇒イネーブルOFFによるP,N両トランジスタのオフ状態
⇒実回路では、容量により値がしばらく保持される
_◇ストレングス
Strength
ゲート出力のドライブ強度
⇒トランジスタのチャネル幅の違いによる電流供給能力の大きさや抵抗性の論理値を表す。
⇒StrongはWeakにかつ
◎Verilog(未リンク)
◎VHDL(未リンク)
◎HDL(Hardware Description Langage)、HDL基本要素
◆モジュール
回路ブロック
回路は回路ブロックを接続して全体構成する
※Verilog
module文
モジュールは入出力のためのポートをもつ
Input Port
Output Port
Inout Port
モジュール内には回路の動作を定義する
_◇階層設計
コンポーネントとインスタンス化
Component, Instantiation
上位モジュールからあるモジュールはコンポーネントとして呼び出される
⇒インスタンス化
_◇パラメータ設計
ビット幅などをパラメータ化し、上位階層に対応させて下位階層を生成する
※SystemC
template
※VerilogHDL
parameter
_◇プロセス
①プロセス内に複雑な機能記述をする
②モジュールには複数のプロセスを含めることができる
③プロセスは並行に動作する
⇒プロセス内の構文は手続き的順序による
※センシティビティ・リスト
Sensitivity List
センシティビティ・リストの新お具またはイベントが変化すると
プロセス内が実行される
⇒イベント待ち構文で停止し、次のイベント変化まで待機する
⇒VerilogHDLでは@文
⇒SystemCでは sensitive 文⇒wait()までを実行する
※SystemC
SC_THREAD スレッド
SC_CTHREAD クロック同期スレッド
SC_METHOD メソッド
⇒繰り返しはメソッドプロセスか、スレッドプロセス内に構文で書く
※VerilogHDL
always
initial
⇒alwaysは繰り替す
_◇信号
Signal
配線をモデル化したもの
※ドライブ
信号の論理値を保持(電圧を固定)
※SystemC
sc_signal
※VerilogHDL
wire
⇒Verilogではドライブしないとハイインピーダンスとなる
※デルタ遅延
ある時刻に変化する値の評価がすべて済んだ後に代入される
⇒伝播のケースでは繰り返し更新、新たな処理がなくなれば次のシミュレーション
時刻に進める
⇒Verilog
assign文もしくは、ノンブロキング代入<=によればデルタ遅延で評価される
=は順序ができる
※実行処理の順序が明確なプロセス内の手続き記述のみに変数を用いる
※プロセス間やモジュール間はデルタ遅延を用いる
_◇変数
Variable
プロセス内で使用する
右辺の評価後、即代入される
※異なるクロックエッジ間で値を保持するためにはレジスタを使わねばならない
◎HDLシミュレータ
◆イベントドリブン・シミュレータ
タイミングと機能の両方を検証できる
◆サイクルベース・シミュレータ
同期設計対象、タイミング検証せず、機能のみ検証
◆ハードウエア・アクセラレータ
◎Verilog-VHDL比較
いずれもIEEEで標準化されている
⇒それぞれにVersionあり,Version間で記述方法に違いがある.
※Verilog-HDL
論理Simulatorを意識した言語
※VHDL
Hardwareを意識した言語
「本来HDLは,従来の回路Entry Toolを使用して,設計者が入力していた作業を,Programming言語とLogic Synthesis(論理合成)Toolで置き換えることで,効率の向上と,Documentへの容易な変換(反映)を目指したものであるが,後者については未だに達成できてはいない.」
※信号
VHDLでは signal の1種類
Verilog HDLでは wireとregを使い分ける必要がある
◆例1 Low-Active非同期Reset付JK-Flip/Flop
①Verilog-HDLのGate Level(Netlist)
②Verilog-HDLのRTL(Register Transfer Level)
③VHDL
で記述する
Verilog-HDL Gate Level(Netlist)——————
module JKR ( RST , CLK , JIN , KIN , OUT , OUTB ) ; input RST ; input CLK ; input JIN ; input KIN ; output OUT ; output OUTB ; JKR U0 (.CK(CLK), .R(RST), .J(JIN), .K(KIN), .Q(OUT), .XQ(OUTB) ); endmodule
Verilog-HDL RTL ——————————–
module JKR ( RST , CLK , JIN , KIN , OUT , OUTB ) ; input RST ; input CLK ; input JIN ; input KIN ; output OUT ; output OUTB ; reg JK_Reg ; always @(negedge RST or posedge CLK) begin if(RST == 1'b0) begin JK_Reg <= 1'b0 ; end else begin if(JIN == 1'b0 && KIN == 1'b1) begin JK_Reg <= 1'b0 ; end else if(JIN == 1'b1 && KIN == 1'b0) begin JK_Reg <= 1'b1 ; end else if(JIN == 1'b1 && KIN == 1'b1) begin JK_Reg <= ~JK_Reg ; end end end assign OUT = JK_Reg ; assign OUTB = ~JK_Reg ; endmodule
VHDL ——————————————-
architecture JKR is port ( RST : in std_logic ; CLK : in std_logic ; JIN : in std_logic ; KIN : in std_logic ; OUT : out std_logic ; OUTB : out std_logic ) ; end JKR ; entity RTL of JKR is JK_Reg : std_logic ; begin process (RST, CLK) begin if RST = '0' then JK_Reg <= '0' ; elsif CLK'event and CLK = '1' then if JIN = '0' and KIN = '1' then JK_Reg <= '0' ; elsif JIN = '1' and KIN = '0' then JK_Reg <= '1' ; elsif JIN = '1' and KIN = '1' then JK_Reg <= Not JK_Reg ; end if ; end if ; end process ; OUT := JK_Reg ; OUTB := Not JK_Reg ; end RTL ;
◆例2 1-bit HalfAdder
Verilog-HDL Gate Level(Netlist) —————-
module HALFADDER ( AIN , BIN , SOUT , COUT ) ; input AIN ; input BIN ; output SOUT ; output COUT ; EO2 U0 (.I0(AIN), .I1(BIN), .X(SOUT) ); AD2 U1 (.I0(AIN), .I1(BIN), .X(COUT) ); endmodule
Verilog-HDL RTL ——————————–
module HALFADDER ( AIN , BIN , SOUT , COUT ) ; input AIN ; input BIN ; output SOUT ; output COUT ; wire RESULT ; assign RESULT = AIN + BIN ; assign COUT = RESULT[1] ; assign SOUT = RESULT[0] ; endmodule
VHDL ——————————————–
architecture HALFADDER is port ( AIN : in std_logic ; BIN : in std_logic ; SOUT : out std_logic ; COUT : out std_logic ) ; end HALFADDER ; entity RTL of HALFADDER is RESULT : std_logic_vector(1 downto 0) ; begin RESULT := AIN + BIN ; SOUT := RESULT(0) ; COUT := RESULT(1) ; end RTL ;
◎HDL設計のガイドライン
◆Common Coding Style
◆Naming Conventions
①VHDL, Verilog(System Verilog)のキーワードは相互に避ける
⇒混在デザインの対策
②$,/,>,<などの記号を名前に使わない
③デバイス特有の名称を避ける 例) CLB, CLK, GND, VCC, DCM, P1,… ④16文字以内とする
⑤接続や目的などの意味の分かる名
⑥全大文字か、全小文字とする ⇒Verilogはケースセンシティブだが、VHDLは区別なし
※Xilinxレコメンド
library names keyword moddule names entity names user component names internal signals USER PORTS INSTANCE NAMES UNISIM COMPONENT NAMES PARAMETERS GENERICS Comment
⑦ファイル名とエンティティ名もしくはモジュール名はあわせる
⑧1エンティティもしくは1モジュールを1ファイルとする原則
⑨合成スクリプトとトップレベルのデザインファイルの名前をあわせる原則
⑩ポートマップは名前で接続、1行、1ポート
⑪1行80文字以内とする
⇒Xilinxレコメンド あまり深いifやcaseのネストは最適化の妨げとなる
◆共通ヘッダ
◆記述
_◇定数 変数を定数に利用しない constant か parameterで定義
_◇インデント 3~4文字スペースとする
_◇ファイル名 Verilog .v VHDL .vhd を保つ
_◇合成の制御
TRANSLATE_OFF, TRANSLATE_ON 合成対象部分を制御するのに使えるが、なるべく避ける
⇒sim Onlyコードは、テストベンチなりsim Onlyファイルにまとめる。
_◇ASYNC_REG=TRUE
‘X’の伝播を防ぐためのレジスタオプション
_◇SIM_COLLISION_CHECK
RAMでのREAD/WRITEのコリージョンをチェックする
_◇VHDL:std_logicかSTD_LOGIC_VECTORでポート宣言
※VHDL:arrayをPORT宣言しない VHDLでは可能でも Verilog, EDIFとの互換性がない
_◇VHDL:Buffer型に注意
内部信号とout型の外部出力にわける 内、外部で使うと論理合成でエラーとなることがある
_◇Verilog:`timescale 1ns/1ps
FPGAのDCMなどでは1psのレゾリューションが必須
◆回路
_◇クロッキング
1モジュール1クロック あるいは 1クロックを全モジュールへ
_◇Asynchronous FIFO
両側のサブシステムのクロックが非同期なFIFO ⇒正しいシミュレーションできない
_◇ifとcase
※if プライオリティ付きのエンコード
排他的
⇒出力をしないパスを作ると、余計なラッチができる
⇒ifへの条件信号はなるべく少なく、数が多いときはプリデコードしてラッチしてから入れる
⇒ifには制御信号を入れる(複雑なdataflowを入れない)
⇒異なる表現、クリティカルパス対処
※case ケース平等なロジック、複雑なデコード
◆最適化
_◇階層
最適化は同じ階層内でしかかからないので、関係ある組み合わせ回路などは同じ階層にまとめる
※階層をまたぐ出力は reg にする
⇒タイミングをコントロールしやすくするため
◆テストベンチ
_◇自動化
①データベース比較 アウトプットをゴールデンベクタと比較
②波形比較 HDL Bencherなど使用
③セルフチェック
◆シミュレータ
テストベンチをかくまえにシミュレータについて知っておく
_◇イベントベースとサイクルベース
※イベントベース 遅延はゲートなりネットなりにそれぞれつく
※サイクルベース 遅延は組み合わせ回路全体につく。同期設計用で細かい遅延は正確ではない。
⇒遅延のタイミングは明示的に記述すること
⇒シミュレータの成り行きに任すと、シミュレータの違いが出ることがある
_◇無限ループ
clock以外は無限ループの中に入れないこと
⇒イベントベースでは、イベント増=メモリ要求量増+速度低下
◎iverilog (Icarus Verilog Simulator)
◆シミュレータの使用方法
①シミュレーションに必要なVerilog-HDLファイルを用意.
※コンパイルのためにファイルリストの作成 verilogソースファイル名をリストしたファイルリストを作成する。
例)
led_toggle.v
led_toggle_tb.v
②DOS窓を開きコンパイル
iverilog verilog_file_1 verilog_file_2 verilog_file_3 ...
通常,a.outなる中間ファイルが生成される.
または,
iverilog -o out_file verilog_file_1 verilog_file_2 verilog_file_3 ...
として実行すると,out_fileなる中間ファイルが生成される.
※ファイルリストを使ってコンパイルする場合
iverilog -o output.vvp -c filelist.txt
これで実行ファイルoutput.vvpが出力される。
iverilog -h
でヘルプが表示される.
③次のコマンドを実行することで,シミュレーションをおこなうことができる.
vvp 中間ファイル
例) vvp output.vvp
※$dumpfile,$dumpvars指定されていればvcdファイルが作成される。
※結果が画面に表示される.結果をファイルに残したい場合は, vvp 中間ファイル > 結果ファイル として,リダイレクトする.
vvp -h
でヘルプが表示される.
④注意事項
$monitorにおけるビットフィールド指定はサポートされていない.
reg [7:0] PC;
$monitor(“PC[3:0]=%h\n”, PC[3:0]);
は実行時にエラーになる.エラーメッセージからは判断できないので,要注意.
◎GTKwave
◆波形表示ツールの使用方法
①テストベンチに次の記述を追加してシミュレーションをおこなう.
$dumpfile(“ファイル.vcd”);
$dumpvars(0, モジュール名);
ここで,$dumpfileシステムタスクは波形表示用の出力ファイル(VCDファイル)を指定するもの.
また,$dumpvarsシステムタスクでは,
第1引数 ダンプ開始時刻
第2引数 観測対象モジュールまたは観測対象信号
を指定する.
例)
$dumpfile(“rslt.vcd”);
$dumpvars(0, adder4);
シミュレーションの結果,rslt.vcdファイルが生成され,モジュールadder4内の信号が保存される.
②起動
次のコマンドを実行する.
winwave rslt.vcd
あるいは
gtkwave rslt.vcd
③波形表示ウィンドウが表示されるので,メニューから
search>>Search Signal Treesで信号を選択する。
階層を展開して観測したい信号を指定し,Appendボタンをクリックする.
⇒ドラッグ&ドロップでもよい
④タイムスケールを調整してシミュレーション結果を観測.
http://www.ialab.is.tsukuba.ac.jp/~logic/iverilog-t/gtkwave.html
◎システム記述言語の記述レベル
◆時間的な概念
_◇アンタイムド
Un-timed
時間的な概念を含まない
⇒一般的ソフトウエア:クロックや時間の経過などの概念がない
⇒計算結果は「ゼロ時間」で戻される
_◇タイムド
Timed
時間的概念を含む
⇒HDL:タイムド、クロックに基づき、イベント、遅延時間の概念あり
◆抽象度
_◇システム(TLM)レベル
Transaction Level Modeling
データの流れを定義したレベル
⇒アンタイムドでもタイムドでもモデリング可能
⇒SystemC
⇒ハードウエアの詳細なバス構造やインタフェースはモデリングしない
⇒詳細な制御信号を持たないバスモデル
※sc_fifoチャネルモデル
モジュールのポート間にFIFOを配置する
⇒モジュールは入力のFIFOにデータが入力されると動作を開始
⇒入力データが無ければ待つ
⇒計算が終了すると出力FIFOに結果を書き込む
⇒出力FIFOが一杯なら空きがでるまで待つ
_◇動作(BCA)レベル
Bus Cycle Accurate
入出力インタフェースはRTLに近いサイクル精度
記述本体は、アンタイムドもしくは抽象度の高いタイムド
⇒バスやピンでRTLと等価⇒RTLとの混在可だが、本体は高速
※動作合成可能モデル
※BCAとRTLの中間にPCA(Pin Cycle Accurate)モデルを定義する場合もある
_◇RTレベル(RTL)
関数内部もレジスタを明確にした記述レベルで具体化する
⇒レジスタ、状態マシンなどの要素を明確に定義する
⇒クロックサイクル毎の動作を明確に割り当てる
※論理合成可能な記述レベル
_◇ゲートレベル
論理ブール式または論理ゲートを接続したネットリスト
⇒ブール式ならテクノロジ非依存
⇒ゲートレベルのネットリストはテクノロジ依存
⇒VerilogHDLだけでなく、EDIF(Electronic Design Interchange Format)も使用される
_◇トランジスタレベル
MOSSIM
◎動作記述~動作合成
◆概要
例) シミュレーション速度
C動作記述 4万行 1MHz
RTL記述 30万行 100Hz
GATE 100万G 10Hz
※RTL記述
逐次的な動作を並列動作に人手でマッピングしなおしている
⇒ミスが入りやすい
⇒RTLといえど回路の構造を考えている
※動作記述
構造は記述せず、動作を記述
⇒記述の抽象度のレベルの違いであって、言語の違いではない
※動作合成ツール
制約を満たせるように構造を探索する
(マイクロアーキテクチャt贋作)
①DFG(データ・フロー・グラフ)の作成
②スケジューリング
面積
性能
トレードオフ
③データパスの作成
④FSM作成
⇒合成単位毎にFSMDを作る
Finite State Machine with DataPath
◎VHDL-AMS
VHSIC -HDL-Analog Mixed signal
電圧Vと電流Iで回路動作を表現できる
◆記述例
_◇抵抗モデル
module resistor(p, n);
input p, n;
electrical p,n;
parameter real r = 100 from [0:inf);
analog
V(p,n) <+ r*I(p,n);
endmodule
_◇容量モデル
module capacitor(p, n);
inout p, n;
electrical p, n;
parameter real c = 0 from [0:inf);
analog
I(p,n) <+ c*ddt(V(p,n));
endmodule
※ddt時間微分
◎Verilog-A
◎SystemC
HDLより抽象度の高いハードウエアやシステムを記述する言語
⇒RTLでは時間のかかるシステム検証、ハード、ソフト協調検証を実用的に行う
⇒動作合成
※標準化団体
OSCI(Open SystemC Initiative)
www.osci.org
IEEE1666
※C++に基づく
※TLM,BCA,RTL記述が可能
⇒RTL記述はVerilogHDLより遅い
⇒ゲートレベルは不可
◆文法
_◇基本構造
最上位階層 sc_main
モジュール SC_MODULEを使って定義、インスタンス化(コンポーネント)
モジュール内でプロセスを定義
SC_METHOD
SC_THREAD
SC_CTHREAD
⇒プロセスは並行的に実行される
⇒プロセス内部は手続き的
モジュールにはポートがあり外部と通信する
※プリミティブ・チャネル
sc_signal
sc_fifo
※階層チャネル
⇒複雑なバスモデルなど
※機能本体と外部とのやり取りのインタフェース設計を分離
_◇SC_MODULE
モジュールの定義を行う
※マクロ
class モジュール名 : public
sc_module {
。。。
}
と同じ
構造例)
#include “systemc.h”
SC_MODULE(モジュール名) {
入出力ポート宣言
メンバ関数、変数宣言
信号宣言
SC_CTOR(モジュール名) {
プロセス宣言
初期値
階層
}
};
記述例)
SC_MODULE(dut)
{
sc_in_clk clock;
sc_in reset;
sc_in in_valid;
sc_in<sc_uint<8>> data_i[8];
sc_out output_valid;
sc_out rgb;
sc_inout<sc_int<4>> addr;
sc_uint<8> shift[5];
sc_uint<6> sum_of_coefs;
sc_uint<8> sample;
bool initialized;
sc_signal<sc_uint<8>> sig_a;
sc_signal sig_b;
void method0();
void thread0();
SC_CTOR( dut )
{
SC_CTREAD(thread0, clock.pos());
reset_signal_is(reset, false);
SC_METHOD(method0)
sensitive_pos << clock;
sensitive_neg << reset;
}
};
_◇SC_CTOR
コンストラクタ宣言
SC_MODULE内でつかう
モジュールをインスタンス化した時に、自動的に呼び出される
※コンストラクタ宣言
SC_CTOR(モジュール名) : 初期化リスト
{
初期化処理;
}
※マクロ
モジュール名(sc_module_name name) :
sc_module(name) {
と同じ
※モジュールの初期化処理を行う
プロセス宣言
SC_THREAD, SC_CTHREAD, SC_METHOD
⇒プロセスを起動する信号やイベントをセンシティビティリストに登録
初期化構文
インスタンスの接続
_◇ポート
※基本的なポート
sc_in
sc_out
sc_inout
※チャネルポート
sc_port
sc_fifo_in
sc_fifo_out
※ポート宣言時にポートのデータタイプを宣言する
※SystemCデータタイプ
sc_int<>
sc_uint<>
sc_fixed<>
※通常のC/C++のデータタイプを使うこともできる
_◇プロセス
複数のプロセスは並行的に動作する
プロセス内部の記述は手続き的
プロセスはイベントにより起動される
※プロセス間の接続
通常sc_signal
⇒信号はデルタ遅延処理
①SC_CTHREAD
クロック同期スレッドプロセス
⇒センシティビティにクロックの立ち上がりまたは立下りを指定し起動
⇒プロセス内にwait()文があると、そこで停止する
⇒次のクロックでその次のwait()文に達するまで再度実行する
※reset_signal_is()構文
クロックにイベント発生⇒reset_signal_isに指定した条件が成り立つ
⇒スレッドの最初に戻り、最初のwaitまで実行
構文例)
SC_CTOR(dut) {
SC_CTHREAD(thread0, CLK.pos());
reset_signal_is(RESET, false);
}
void mymod::thread0() {
{ //RESET
。。。
wait();
}
初期化処理;
while ( true ) {
{ //入出力
}
メイン処理
{ //入出力
}
}
}
⇒while無限ループでクロックに同期した繰り返しを定義
⇒無限ループには必ずwait()文がなければならない
⇒プロセス内のローカル変数の値は、待機状態に入っても暗黙的に保存され、保持される。
記述例)
void thread_proc0 {
y=0;
wait();
while(true) {
if (sel.read() == 1) {
a_i = a.read();
b_i = b.read();
wait();
y.write(a_i + b_i);
}
wait();
}
};
②SC_THREAD
クロックイベントだけでなく、信号やイベントに対するセンシティビティを指定可能
SC_CTHREADより高速
※センシティビティの定義
ストリーム構文 sensitive
⇒プロセスや、センシティビティに指定した信号が到着するとwait文まで実行
※初期化
通常はシミュレーション開始時に実行され、初期化される。
初期化したくない場合は dont_initialize()関数を指定
reset_signal_is構文はサポートされない
⇒リセット動作が必要な場合、waitの直後でifで判断、gotoでプロセス先頭に戻す必要がある。
コンストラクタ)
SC_CTOR(dut) {
SC_THREAD(thread0);
sensitive_pos << clk;
sensitive_neg << reset_n;
SC_THREAD(thread1);
sensitive << sig_a << sig_b;
dont_initialize();
}
スレッドプロセス)
void thread_proc0 {
L0: y=0;
wait();
while (true) {
if (reset_n.read() == 0) goto L0;
if (sel.read() == 1) {
a_i = a.read();
b_i = b.read();
wait();
if (reset_n.read() == 0) goto L0;
y.write(a_i + b_i);
}
wait();
}
};
③SC_METHOD
センシティビティリストのいずれかのイベントが起こると起動
⇒起動するとプロセス全体を実行
⇒実行完了で実行制御をシミュレーションカーネルに戻す
※プロセスが起動されるたびにメソッド内のローカル変数は再定義される
⇒前の値は保たれないので、保つためにはグローバル変数か、static宣言する
※初期化したくない場合はdont_initialize()指定
※RTLと等価な記述に用いる
Dフリップフロップの記述例)
SC_MODULE(DFFR) {
sc_in_clk CLK;
sc_in RESET;
sc_in<sc_uint<4> > DIN;
sc_out<sc_uint<4> > Q, QB;
sc_signal<sc_uint<4> > sig_Q;
SC_CTOR(DFFR) {
SC_METHOD(method0);
sensitive << CLK.pos();
sensitive << RESET.neg();
SC_METHOD(out_buffer);
sensitive << sig_Q;
}
//DEF
void method0() {
if (!RESET.read())
sig_Q = 0;
else
sig_Q = DIN.read();
}
//output buffer
void out_buffer() {
Q = sig_Q.read();
QB = ~sigQ.read();
}
};
_◇関数
※モジュールに属する関数
①モジュール外でスコープ演算子により定義
モジュール名::関数名
②モジュール内で定義
◆処理系
g++/gcc コンパイラによる
通常のC++プログラム同様、ヘッダは .h コードは .cpp
Makefileを定義し、makeする
SystemCのヘッダを読み込み、クラスライブラリとリンクすることでシミュレーション可能な実行オブジェクトができる
※設計ファイルに依存しない共通環境は Makefile.defsに指定する
◆動作合成
※動作合成可能なサブセットは、OSCI(Open System C Initiative)で標準化
◎System Verilog