約 2,416,726 件
https://w.atwiki.jp/arcadegames/pages/15.html
== SYSTEM C == SYSTEM Cはセガが開発したアーケードゲーム用システム基板。同社製メガドライブのシステムと一部互換性を持つ。SYSTEM CとSYSTEM C2がある。 メガドライブとの違いは、音源制御用のZ80が搭載されていないこと、またADPCM音源が追加されていることなど。 == SYSTEM C == マザー シルク形番 パターン形番 == SYSTEM C2 仕様および主要チップ == マザー シルク形番 パターン形番 SYSTEM C2には基板を2枚接続し情報通信することができる専用コネクタが装着されているものもある。(ぷよぷよ通など) 音源 FM音源 YM3438 (OPN2C) (YAMAHA) 24ピンDIP ADPCM音源 uPD7759C (NEC) 40ピンDIP 315-5242 32ピンハイブリッドIC。画像用D/Aコンバータモジュール 315-5313 VDP (YAMAHA) 128ピンQFP 315-5296 I/O LSI (NEC) 100ピンQFP SYSTEMC2に実装されている315-5296
https://w.atwiki.jp/bambooflow/pages/71.html
波形ツール(GTKWave) 波形ツール(GTKWave)インストール 実行(VCDファイル)実行画面 その他 とりあえず、フリーの波形ツールgtkwaveを使う。 GTKWave Analyzer GTKWaveで表示できるのは、VCD,LXT,LXT2,VZT,GHW。 詳細な使い方はGTKWaveのユーザーズガイド(.pdf)を参照。 インストール $ ./configure $ make # make install 実行(VCDファイル) $ gtkwave dump.vcd とりあえず、添付ファイルでも実行してみれば。 sample.tgz 実行画面 その他 コマンド 説明 使い方 gtkwave [option]... [DUMPFILE] [SAVEFILE] [RCFILE] VCD,LXT,LXT2,VZT,ファイルの波形表示 gtkwave dump.vcd twinwave arglist1 + arglist2 1つのウィンドウで複数示 twinwave file1.vcd fil1.sav + file2.vcd file2.sav lxt2miner [option]... [LXT2FILE] LXT2ファイルのデータ検索 lxt2miner dumpfile.lxt2 --hex 20470000 -n lxt2vcd filename LXT2ファイルからVCDへの変換 lxt2vcd file.lxt mvl2lxt filename.aet filename.lxt MVLSIM AETファイルからLXTへ変換 mvl2lxt file.aet file.lxt mvl2vcd filename.aet MVLSIM AERファイルからVCDへ変換 mvl2vcd file.aet rtlbrowse stemsfilename Verilog HDLソースコードとライブラリ ファイルの階層表示 tex2vcd filename.aet TEXSIM AETファイルからVCDへ変換 tex2vcd file.aet tla2vcd [option]... TLAFILE [[TLAFILE]...] TLA(Tektronix Logic Analyzers)からVCDもしくはLSTファイルへ変換 tla2vcd [option] ... tlafile [tlafile ...] vcd2lxt [VCDFILE] [LXTFILE] [option]... VCDファイルからLXTファイルへ変換 vcd2lxt2 [option]... [VCDFILE] [LXTFILE] VCDからLXT2ファイルへ変換 vcd2vzt [option]... [VCDFILE] [VZTFILE] VCDファイルからVZTファイルへ変換 vermin [VERILOGFILE]... [option]... Verilof-HDLファイルを解析し処理する vzt2vcd filename VZTファイルからVCDファイルへ変換 vztminer [option]... [VZTFILE] VZTファイルの検索 vztminer dumpfile.vzt --hex 20470000 -n shmidcat [VCDFILE] 共有メモリTrampoline shmidcat file.vcd gtkwave -v -I file.sav
https://w.atwiki.jp/bambooflow/pages/122.html
SystemC TLM-2.0クラス TLM-2.0のクラスから全体的な構成をみる。 SystemC TLM-2.0クラスTLM2.0のクラス構成ディレクトリ構成 TLM-1標準TLM-1 コア・インターフェース TLM-1 fifo インターフェース tlm_fifo マスタ・スレーブ・インタフェース TLM-2 コア・インタフェースブロッキング・トランスポート・インタフェース ノン・ブロッキング・トランスポート・インタフェース ダイレクト・メモリ・インタフェース デバッグ・トランスポート・インタフェース イニシエータとターゲット・ソケット ジェネリック・ペイロード Phases ユーティリティ便利なソケット ペイロード・イベント・キュー Quantumキーパー インスタンス仕様 拡張 解析ポート 解析インタフェース TLM2.0のクラス構成 ディレクトリ構成 include/tlm tlm_h tlm_req_rsp TLM-1.0 legacy tlm_trans TLM-2 interoperability classes tlm_2_interfaces TLM-2 core interfaces tlm_generic_payload TLM-2 generic payload tlm_sockets TLM-2 initiator and target sockets tlm_quantum TLM-2 global quantum tlm_analysis TLM-2 analysis interface, port, fifo tlm_utils TLM-2 utilities TLM-1標準 TLM-1 standard TLM-1とTLM-2は別物。 TLM-1 コア・インターフェース tlm_transport_if tlm_blocking_get_if tlm_blocking_put_if tlm_nonblocking_get_if tlm_nonblocking_put_if tlm_get_if tlm_put_if tlm_blocking_peek_if tlm_nonblocking_peek_if tlm_peek_if tlm_blocking_get_peek_if tlm_nonblocking_ge_peek_if tlm_get_peek_if TLM-1 fifo インターフェース tlm_fifo_debug_if tlm_fifo_put_if tlm_fifo_get_if tlm_fifo tlm_fifo マスタ・スレーブ・インタフェース tlm_blocking_master_if tlm_blocking_slave_if tlm_nonblocking_master_if tlm_nonblocking_slave_if tlm_master_if tlm_slave_if TLM-2 コア・インタフェース ブロッキング・トランスポート・インタフェース Blocking transport interface tlm_blocking_transport_if virtual void b_transport (TRANS trans, sc_core sc_time t)=0 TLM-2.0draft2で存在していた次のクラスがなくなっている。 tlm_fw_b_transport_if tlm_bw_b_transport_if ノン・ブロッキング・トランスポート・インタフェース Non-blocking transport intarface tlm_fw_nonblocking_transort_if virtual tlm_sync_enum nb_transport_fw (TRANS trans, PHASE phase, sc_core sc_time t)=0 tlm_bw_nonblocking_transport_if virtual tlm_sync_enum nb_transport_bw (TRANS trans, PHASE phase, sc_core sc_time t)=0 ダイレクト・メモリ・インタフェース Direct memory interface tlm_fw_direct_mem_if virtual bool get_direct_mem_ptr (TRANS trans, tlm_dmi dmi_data)=0 tlm_bw_direct_mem_if virtual void invalidate_direct_mem_ptr (sc_dt uint64 start_range, sc_dt uint64 end_range)=0 デバッグ・トランスポート・インタフェース Debug transport interface tlm_transport_dbg_if virtual unsigned int transport_dbg (TRANS trans)=0 イニシエータとターゲット・ソケット Initiator and target sockets tlm_initiator_socket tlm_target_socket ジェネリック・ペイロード Generic payload tlm_generic_payload Phases tlm_phase このパラメータは、ノン・ブロッキングI/F時、タイミングポイントを決定するのに使用する。 パラメータをイニシエータとターゲット間で使用する。 ユーティリティ 便利なソケット Convenience sockets simple_initiator_socket simple_initiator_socket_tagged simple_target_socket simple_target_socket_tagged passthrough_target_socket passthrough_target_socket_tagged multi_passthrough_initiator_socket multi_passthrough_target_socket tlm_bw_transport_ifを継承している。 tagged 入力I/Fメソッド呼び出しはどのソケットが到着したかを示すためにIDが付けられる。 tlmに次の基本ソケットがあるtlm_initiator_socket tlm_target_socket ペイロード・イベント・キュー Payload event queues(PEQ) Quantumキーパー Quantum keeper tlm_quantumkeeper インスタンス仕様 拡張 Instance-specific extension 解析ポート Analysis ports tlm_analysis_fifo<> tlm_analusis_port<> 解析インタフェース Analysis interface tlm_analysis_if<>
https://w.atwiki.jp/bambooflow/pages/146.html
SystemCのモデリングでは、モジュール間の通信にインターフェース、ポートおよびチャネルを使用する。 これは、従来のハードウェア記述よりも抽象度をあげるためである。 インターフェースとポートとチャネルインターフェース ポート チャネル インターフェースとポートとチャネル インターフェース インターフェースはvirtual=0のメソッドのみで構成された抽象クラス(インターフェース・クラス)。 インターフェース・クラスはsc_interfaceを継承する。 インターフェースはポートとチャネルの基底クラスとなる。 ポートとチャネルが共通のインターフェースを持つことで接続が可能となる。 インターフェースは通常入力と出力の2つのインターフェースを準備する。 sc_interface ポート モジュールが外部との通信を行うための口。 sc_port<> template class IF, int N=1 class sc_port ... { public IF* operator- (); }; sc_portのテンプレートクラスは2つの引数をとる。 sc_portの<>には第一引数は、インターフェースを書く。 第二引数は、ポート数を書く。Nを1より大きくすることで多重ポートが実現可能。 するとsc_portはインターフェースを継承し、インターフェースのメソッドが使用できるようになる。ただし、シミュレーション実行前にチャネルとの接続が必要。 ポートのインターフェースメソッド呼出しは->を使用する。これは、operator- ()により実現している。 チャネル チャネルについて
https://w.atwiki.jp/system818/pages/39.html
第4章 単一行関数について 4.1 単一行関数とは ・値を数値処理したり、文字列を変換したり、値を別のデータ型に変換したりすることができます。 (1行の入力から1つの結果が戻る) 4.2 数値関数 (表)数値関数一覧 関数名 機能 書式 説明 CEIL n以上の最も小さい整数を戻します CEIL(n) n 計算対象の値 FLOOR n以下の最も大きい整数を戻します FLOOR(n) n 計算対象の値 nの値が正ならば切捨て。負ならば切り上げである。 MOD mをnで割った余りを戻します MOD(m,n) m 計算対象の値 n 割る値 nが0の時には、mを戻す。mが0の時には、0を戻す。 ROUND 数値を指定桁で丸めます ROUND(n[,i]) n 計算対象の値、i 四捨五入する桁数を指定 四捨五入する桁数が正数のとき小数点以下の桁数。負数の場合は正数の桁数になる。 TRUNC 数値を指定桁で切り捨てます TRUNC(n[,i]) n 計算対象の値、i 切り捨てる桁数を指定 四捨五入する桁数が正数のとき小数点以下の桁数。負数の場合は正数の桁数になる。 ※CEIL関数…正の数に限っては、切り上げです。負の数の場合は、切り上げにはならない。 4.3 文字関数 INICAP関数 機能 書式 説明 文字の各単語の先頭に大文字に、2文字以後を小文字に変換して戻します INITCAP(s) s 文字列 単語の区切りは、空白、記号等です。 INSTR関数 機能 文字列から指定の文字位置を戻す 書式 s1 検索対象の文字 s2 検索する文字 p s1の検索を開始する文字位置(負数の場合、文字の最後からの逆検索) o 一致した回数 p,oまたはoは、省略可能 説明 ・s1のpの位置からs2を検索して、o番目に一致した文字列を戻します。 ・検索文字と一致しない場合には、0が戻る。 (例・・・INSTR関数) INSTR( ABCdefGHIABC , ABC , -1, 2) ⇒ 1 ↑ ↑ 2回目検出 1回目の検出 ※上記は、ABCの数が2回目の検出の際の ABC を指している。 ※仮にINSTR( ABCdefGHIABC , ABC , 1, 2)の場合は1回目の検出のところになるので、 解答は"10番目"になる。 SUBSTR関数 機能 文字を指定位置から指定文字分に切り出した文字を戻します 書式 SUBSTR(s,p[,I]) s 対象の文字列 p 切り出す文字位置(負数の場合、文字の終わりからの指定になる) I 切り出す文字列(省略可、省略すると文字の最後までを切り出す) 説明 sの文字列のp番目から長さIだけの文字を切り出します LENGTH関数 機能 書式 説明 文字の長さを戻す LENGTH(c) c 文字列 cの文字の長さを戻し、文字がNULLの場合はNULLを戻します。 ■文字関数での全角文字の扱い ・文字関数は、デフォルトで全角文字と半角文字を同じ1文字として扱う。 ・LPAD、LTRIM、RPAD、RTRIM、TRIM関数には、バイト単位で扱う関数ではない。 LENGTHB関数 機能 書式 説明 文字のバイト数を戻す LENGTHB(c) c 文字列 cの文字のバイト長を戻し、全角の1文字は2バイトです。文字がNULLの場合は、NULLを戻す。 LOWER関数 機能 書式 説明 文字を小文字に変換 LOWER(c) c 文字列 cのすべての文字を小文字に変換 UPPER関数 機能 書式 説明 文字を大文字に変換 UPPER(c) c 文字列 cのすべての文字を大文字に変換 LPAD関数 機能 書式 説明 文字の左側に文字を埋めて戻す LPAD(c1,n[,c2]) c1 文字列 n 変換して戻す文字列 c2 埋める文字 c1の左側に、c1の文字列がnになるまで、c2の文字を埋めます LTRIM関数 機能 書式 説明 文字の左側から指定文字を削除 LTRIM(c[,s]) c 文字列 s 削除する文字 cの左側の連続したsの文字を削除。cにs以外の文字を見つけたら処理終了 TRIM関数 機能 書式 説明 文字の指定方向から指定文字を削除 TRIM([[LEADING┃TRAILING ┃ BOTH] s FROM ] c c 文字列 s 削除する文字 cの左側の連続したsの文字を削除。sを省略すると空白が使用される。 4.4 日付関数 ADD_MONTH関数 機能 書式 説明 日付に月数を加算した日付を戻す ADD_MONTHS(d,n) d 日付 n 日付に加算する月数(マイナスの値を指定することも可能) 日付dにnの月数を加算した日付を戻す LAST_DAY関数 機能 書式 説明 指定月の月末の日を戻す LAST_DAY(d) d 日付 日付dの月末の日付を戻す MONTHS_BETWEEN関数 機能 書式 説明 2つの日付の月間数を戻す MONTHS_BETWEEN(d1,d2) d1 日付,d2 日付 日付d1-d2の月数を戻す NEXT_DAY関数 機能 日付以降の最新の指定曜日の日付を戻す 書式 NEXT_DAY(d,c) 説明 日付dから後の指定曜日の日付を戻します。 現在の日付が指定曜日の時は、次の週の指定曜日の説明が戻されます。 曜日は、 木 、 木曜日 、5(曜日の番号)等で指定することができます。 SYSDATE関数 機能 書式 説明 現在の日付に戻す SYSDATE 日付は、サーバの日付情報で、日付には年月日以外にも時分秒も含まれます。 ※日付の演算として、 ・日付 + 日付 ・日付 * 日付 ・日付 / 日付 ・日付 / 数値 等の演算はできない。 ROUND関数(日付) 機能 書式 説明 指定した単位で日付を戻す ROUND(d,[f]) d 日付,f 日付書式モデル 日付書式モデルとして、年、月、日、時、分、秒等の単位を指定できる。 ※YEARの切り上げ時期 ・年を表す書式は、 YEAR だけでなく、 YYYY , YYY , YY , Y を指定できる。 ※MONTHの切り上げ時期 ・月を表す書式は、 MONTH だけでなく MM , MON を指定できます。 4.5 変換関数 ■日付型データと数値型データを直接変換する関数はない。 (例)日付型データから数値型データへ変換してから数値型データに変換します。 日付型データ→文字型データ→数値型データ (例)数値型データを、文字型データに変換してから日付型データに変換します。 数値型データ→文字型データ→日付型データ TO_CHAR関数(日付) 機能 日付dを日付書式モデルに従い文字列データに変換 書式 TO_CHAR(日付データ,日付書式) 説明 日付データを日付書式の形式の文字列に変換する TO_DATE関数(数値) 機能 文字型データcを日付書式モデルに従い日付型データに変換 書式 TO_DATE(文字列, 日付書式) 説明 日付書式の形式で指定した、文字列をDATE型に変換する TO_NUMBER関数 機能 文字型データcを数値書式モデルに従い数値型データに変換します。 書式 TO_NUMBER( 数値文字列, [ 書式 ] ) 説明 TO_NUMBERは引数で指定した文字列を、指定した書式に沿って、数値に変換します。 4.6 NULLを扱う関数 COALESCE関数 機能 書式 説明 リストの最初のNULLでない値を戻す COALESCE(a,b,c,....) 関数内のa,b,c,...で、最初のNULLでない値を戻す。 NULLIF関数 機能 書式 aとbが等しい時、NULL値を戻す NULLIF(a,b) a 判定対象の値 b 判定対象の値 NVL関数 機能 書式 aがNULLのとき、bの値を戻します。aがNULLでないとき、aの値を戻します。 NVL(a,b) a 判定対象の値 b 判定対象の値 NVL2関数 機能 書式 aがNULLでない時、bの値を戻します。aがNULLのとき、cを戻します。 NVL2(a,b,c) a 判定対象の値 b aの値がNULL以外のとき、返す値 c aの値がNULLの時返す値 4.7 その他の関数 DECODE関数 機能 対象と一致する値に対応するデータを戻す 書式 DECODE(列名 | 式,条件1,値1,...{デフォルト値}) 説明 式と条件が一致する最初の値が戻される。どれにも一致しなった場合はELSE句に指定したデフォルト値が返される。 ※CASE句とDECODE句との違い CASE式では、WHEN句でEXISTS、比較条件、IN、BETWEEN、LIKEなどの演算子が使用可能だが、DECODE関数では使用不可能。 DECODE関数では、DECODEは NULL = NULL の評価は True となるが、CASE式ではNULLとなるCASE式でNULLを評価する場合は、WHEN句でIS NULLを使う。 GREATEST関数 機能 書式 説明 リスト内の最大値を戻す GREATEST(e,[...] e,[...] 判定対象の値) 判定対象は、数値、文字列値、日付値等です。 4.8 書式モデル こちらの章については 書式モデルを参考にしてください。
https://w.atwiki.jp/arcadegames/pages/153.html
== SYSTEM18 == SYSTEM18はセガが開発したアーケードゲーム用システム基板。SYSTEMC/C2と同様にメガドライブ、GENESISと同じVDPを採用している。メイン基板にはいくつかのバージョンがある。 == SYSTEM18 MAIN PCB == シルク 837-7177 パターン 171-5873B 837-7177 SYSTEM18 == SYSTEM18 (837-7177) 主要チップ一覧 == チップ型番 外観 機能など FD1094 HITACHI 68000 CUSTOM MPU 315-5242 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) VIDEO DAC 315-5296 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) I/O CONTROLLER 315-5313 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) VDP メガドライブ、GENESISなどでも使用 315-5360 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) メモリマッピングなどを行っているものとみられる 315-5361 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) 315-5362 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) 315-5373 PAL PLS153N 315-5374 PAL PALCE16V8H-25PC 315-5375 PAL PAL16R6DCN 315-5389 PAL PALCE16V8H-25PC 315-5390 PAL PALCE16V8H-25PC 315-5391 PAL PALCE16V8H-25PC RF5C68A imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) PCM SOUND CHIP YM3438 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=100 center) FM SOUND CHIP 2つ実装。 == SYSTEM18 ROM BOARD== 2種類のROMボードがある。 (1) シルク 837-7525 パターン 171-5987A OBJ ROM 最大8Mビットx8(OBJ0-O,OBJ0-E,OBJ1-O,OBJ1-E,OBJ2-O,OBJ2-E,OBJ3-O,OBJ3-E) SOUND ROM x4(SOUND0~3) SCR ROM x6(SCR0~5) ROM 0-O,ROM0-E,ROM1-O,ROM1-E == SYSTEM18 ROM BOARD(837-7525) 主要チップ一覧 == チップ型番 外観 機能など 315-5436 (2) シルク 837-7178 パターン 171-???? ROM構成不明 == SYSTEM18対応ゲーム一覧 == ゲーム名 ゲーム型番 システムの各種形番 ムーンウォーカー メイン基板ラベル 833-7528 MOONWALKERメイン基板ラベル 837-7530 メイン基板形番(エッチング文字) 171-5873-02Aメイン基板シルク印刷 ???-???? SYSTEM18ROMボードラベル 834-7529ROMボードシルク印刷 837-7178 SYSTEM18 エイリアンストーム メイン基板ラベル 833-7379 ALIENSTORMメイン基板ラベル 837-7381 メイン基板形番(エッチング文字) 171-5873Bメイン基板シルク印刷 837-7177 SYSTEM18ROMボードラベル ROMボードシルク印刷+ラベル SYSTEM18 REV.A == リンク == セガ
https://w.atwiki.jp/bambooflow/pages/64.html
遅延モデル プログラム例 SC_MODULE( LAT ) { sc_in sc_uint 8 input; sc_out sc_uint 8 output; sc_uint 8 temp; sc_event ev_next; SC_CTOR( LAT ) { SC_METHOD( process1 ); sensitive input; SC_METHOD( process2 ); sensitive ev_next; } void process1() { temp = input.read(); ev_next.notify(30, SC_US); } void process2() { output.write( temp ); } }; 説明 8ビットの1入力、1出力の遅延モデル。 process1で入力の信号を監視して、外部からデータが入ってきたら、メンバ変数のtempに入力データを格納する。さらに、30us後に通知するイベントを行う。 process2でev_nextを監視し、process1からのイベントが通知されたら、出力にtempのデータを書き込む。
https://w.atwiki.jp/bambooflow/pages/73.html
サンプル FIFO RTL fifo_rtl.tgz
https://w.atwiki.jp/systemc/pages/23.html
LSFのモジュールは、下記の表に用意されたものを使用する。アナログ演算を行うためのモジュールが用意されている。 LSFモジュール名 機能 sca_lsf sca_add 2つのLSF信号を重み付け加算 sca_lsf sca_sub 2つのLSF信号を重み付け減算 sca_lsf sca_gain LSF信号に固定ゲインを乗じる sca_lsf sca_dot LSF信号を微分 sca_lsf sca_integ LSF信号を積分 sca_lsf sca_delay LSF信号を遅延 sca_lsf sca_source LSF信号源 sca_lsf sca_ltf_nd 分数形式時間ドメイン表記の伝達モジュール sca_lsf sca_ltf_zp 極零形式時間ドメイン表記の伝達モジュール sca_lsf sca_ss 状態空間表現の伝達モジュール sca_lsf sca_tdf_gain LSF入力にTDF信号ゲインを乗じる sca_lsf sca_tdf_source TDF信号をLSF信号に変換 sca_lsf sca_tdf_sink LSF信号をTDF信号に変換 sca_lsf sca_tdf_mux 2つのLSF入力から1つ選んで出力、TDF信号で制御 sca_lsf sca_tdf_demux 1つのLSF入力を2つのLSF出力のどちらかへ出力、TDF信号で制御 sca_lsf sca_de_gain LSF入力に離散信号ゲインを乗じる sca_lsf sca_de_source 離散信号をLSF信号に変換 sca_lsf sca_de_sink LSF信号を離散信号に変換 sca_lsf sca_de_mux 2つのLSF入力から1つ選んで出力、離散信号で制御 sca_lsf sca_de_demux 1つのLSF入力を2つのLSF出力のどちらかへ出力、離散信号で制御 2012-01-30 19 34 37 (Mon)
https://w.atwiki.jp/bambooflow/pages/162.html
SystemC SCVによるランダム生成 メモ書き。 基本的なランダム生成もっとも簡単なランダム生成 配分ランダム生成 重み付けランダム生成 重み付けランダム生成(レンジ指定) 制限付きランダム生成(scv_constraint_baseの使用) もう少し複雑なランダム生成構造体を使ったランダム生成 (応用)構造体+条件付きランダム生成 その他の使い方ランダム生成の停止 分布の指定順列型ランダム生成(RANDOM_AVOID_DUPLICATE) 参照 基本的なランダム生成 もっとも簡単なランダム生成 例:範囲0〜10の整数をランダム生成 // int型のランダム変数data_pを用意 scv_smart_ptr int data_p( "data" ); data_p- keep_only( 0, 10 ); // 0~10までをランダム生成とする設定 for (int i=0; i 10; i++) { data_p- next(); // ランダムの更新(これを実行しないといつまでも同じ値のまま) printf( "data = %d\n", data_p- read() ); // 値を取得 } 実行結果 data = 1 data = 10 data = 6 data = 8 data = 10 data = 2 data = 9 data = 3 data = 0 data = 7 配分ランダム生成 例:範囲を0〜2と99〜100の整数値をランダム生成 scv_random set_global_seed(100); // ランダムのシードを100に設定 scv_smart data_t p( "p" ); p- keep_only( 0, 100 ); // 0~100をランダム生成する p- keep_out( 3, 98); // 3〜98はランダム生成しない for (int i=0; i 10; ++i) { p- next(); printf( "data = %d\n", p.read() ); } 実行結果 data = 100 data = 2 data = 0 data = 1 data = 0 data = 0 data = 99 data = 99 data = 0 data = 100 重み付けランダム生成 例:0〜4の整数を出現率をかえてランダム生成 scv_random set_global_seed(100); scv_bag int dist; dist.add( 0, 50 ); // 50%の割合で0を出現させる dist.add( 1, 30 ); // 30%の割合で1を出現させる dist.add( 2, 10 ); // 10%の割合で2を出現させる dist.add( 3, 8 ); // 8%の割合で3を出現させる dist.add( 4, 2 ); // 2%の割合で4を出現させる scv_smart_ptr int p( "p" ); p- set_mode( dist ); //セット int total = 0; int cnt[5] = {0, 0, 0, 0, 0}; for (int i=0; i 10000; i++) { int p_num; p- next(); // 更新 p_num = p.read(); // ランダム値取得 if (0 = p_num p_num 5) { ++cnt[p_num]; ++total; } } for (int i=0; i 5; i++) { printf( "p=%d, [%4d / %5d]\n", i, cnt[i], total ); } 実行結果 p=0, [5051 / 10000] p=1, [2949 / 10000] p=2, [1038 / 10000] p=3, [ 784 / 10000] p=4, [ 178 / 10000] distで設定されたおおよその出現率でpは出力されていることがわかる。 重み付けランダム生成(レンジ指定) 例:範囲をもった重み付け scv_random set_global_seed(100); scv_bag pair int,int dist; dist.add( pair int,int ( 0, 3), 30 ); // 0〜3の値を30%の割合で出現させる dist.add( pair int,int ( 4,10), 50 ); // 4〜10の値を50%の割合で出現させる dist.add( pair int,int (11,20), 15 ); // 11〜20の値を15%の割合で出現させる dist.add( pair int,int (21,80), 5 ); // 21〜80の値を5%の割合で出現させる scv_smart_ptr int p( "a" ); p- set_mode( dist ); int total = 0; int cnt[5] = {0, 0, 0, 0, 0}; for (int i=0; i 10000; i++) { int p_num; p- next(); p_num = p.read(); if (0 =p_num p_num 4) { ++cnt[0]; ++total; } else if (4 =p_num p_num 11) { ++cnt[1]; ++total; } else if (11 =p_num p_num 21) { ++cnt[2]; ++total; } else if (21 =p_num p_num 81) { ++cnt[3]; ++total; } } printf( "[ 0- 3], [%4d / %5d]\n", cnt[0], total ); printf( "[ 4-10], [%4d / %5d]\n", cnt[1], total ); printf( "[11-20], [%4d / %5d]\n", cnt[2], total ); printf( "[21-80], [%4d / %5d]\n", cnt[3], total ); 実行結果 [ 0- 3], [3047 / 10000] [ 4-10], [4942 / 10000] [11-20], [1500 / 10000] [21-80], [ 511 / 10000] 制限付きランダム生成(scv_constraint_baseの使用) scv_constraint_baseを使うと、制約を1つのクラスにまとめることができるメリットがある。 このクラスは継承することも可能で、制約をより効率的に与えることができるようになる。 例:0〜4または6〜10までの整数値をランダム生成 #include "scv.h" struct data_const public scv_constraint_base { scv_smart_ptr int p; SCV_CONSTRAINT_CTOR(data_const) { SCV_CONSTRAINT( 0 =p() p() 10 p()!=5 ); // ランダム制約 } }; int sc_main( int argc, char* argv[] ) { scv_random set_global_seed(100); data_const data( "data" ); for (int i=0; i 20; i++) { data.next(); // 更新 printf( "data = %d\n", data.p- read() ); // ランダム値取得 } return 0; } 実行結果 data = 7 data = 4 data = 1 data = 0 data = 2 data = 0 data = 6 data = 2 data = 4 data = 7 data = 9 data = 3 data = 9 data = 3 data = 4 data = 4 data = 8 data = 0 data = 6 data = 3 もう少し複雑なランダム生成 構造体を使ったランダム生成 例:ユーザ定義型中の変数をランダム値とする #include "scv.h" // 普通のユーザ定義型を準備 struct mydata_t { sc_uint 16 dat; unsigned char array[3]; }; // ユーザ定義型mydata_tに合わせて定義 SCV_EXTENSIONS( mydata_t ) { public scv_extensions sc_uint 16 dat; scv_extensions unsigned char[3] array; SCV_EXTENSIONS_CTOR( mydata_t ) { SCV_FIELD( dat ); SCV_FIELD( array ); } }; int sc_main( int argc, char* argv[] ) { scv_random set_global_seed(100); mydata_t d; scv_smart_ptr mydata_t p; p- dat.keep_only(0, 10 ); for (int i=0; i 10; i++) { p- next(); // ランダム値更新 d = p- read(); // コピーできる printf( "dat=%d, array=%d, %d, %d\n", (int)d.dat, (int)d.array[0], (int)d.array[1], (int)d.array[2] ); } return 0; } 実行結果 dat=10, array=208, 22, 160 dat=0, array=181, 57, 245 dat=8, array=198, 104, 204 dat=4, array=17, 156, 53 dat=7, array=92, 87, 234 dat=4, array=89, 196, 161 dat=4, array=22, 28, 162 dat=6, array=186, 74, 152 dat=8, array=110, 209, 171 dat=8, array=152, 237, 205 (応用)構造体+条件付きランダム生成 例:ユーザ定義型packet_tを用意→ランダム生成指定 ユーザ定義型を条件付き制約指定 制約を継承して、さらに条件付き制約指定 #include "scv.h" // 通常のユーザ定義型を用意 struct packet_t { sc_uint 32 src_addr; sc_uint 32 dest_addr; sc_uint 16 length; }; //ユーザ定義型packet_tの拡張定義 template class scv_extensions packet_t public scv_extensions_base packet_t { public scv_extensions sc_uint 32 src_addr; scv_extensions sc_uint 32 dest_addr; scv_extensions sc_uint 16 length; SCV_EXTENSIONS_CTOR(packet_t) { SCV_FIELD(src_addr); SCV_FIELD(dest_addr); SCV_FIELD(length); } }; //ユーザ定義型packet_tに対する制約を設定 struct packet_base_constraint public scv_constraint_base { scv_smart_ptr packet_t packet; SCV_CONSTRAINT_CTOR(packet_base_constraint) { // Soft Constraint SCV_SOFT_CONSTRAINT( (packet- length 64) (packet- length 1500) ); // Min Max // Hard Constraint SCV_CONSTRAINT( packet- src_addr() != packet- dest_addr() ); SCV_CONSTRAINT( packet- length() 20 ); } }; // 制約packet_base_constraintを継承して新たな制約packet_constraintをつくる struct packet_constraint public packet_base_constraint { scv_smart_ptr sc_uint 32 dest_min; scv_smart_ptr sc_uint 32 dest_max; SCV_CONSTRAINT_CTOR(packet_constraint) { // use the base constraint SCV_BASE_CONSTRAINT(packet_base_constraint); SCV_CONSTRAINT( (packet- dest_addr() dest_min()) (packet- dest_addr() dest_max()) ); SCV_CONSTRAINT( ((packet- src_addr() (packet- dest_addr() + 0x100000) ) (packet- src_addr() (packet- dest_addr() + 0x200000) )) || ((packet- src_addr() (packet- dest_addr() - 0x10000) )) (packet- src_addr() (packet- dest_addr() - 0xfffff) ) ); SCV_CONSTRAINT( packet- length() == 64 ); } }; int sc_main( int argc, char* argv[] ) { scv_random set_global_seed(100); packet_t pkt; packet_constraint pkt_c( "pkt_c" ); pkt_c.dest_min- disable_randomization(); pkt_c.dest_max- disable_randomization(); *pkt_c.dest_min = 0x100000; *pkt_c.dest_max = 0x800000; for (int i=0; i 10; i++) { pkt_c.next(); pkt = pkt_c.packet- read(); printf( "src_addr = %08x\n", (int)pkt.src_addr ); printf( "dest_addr = %08x\n", (int)pkt.dest_addr ); printf( "length = %d\n", (int)pkt.length ); } return 0; } 実行結果 *** SCV_ERROR CONSTRAINT_ERROR_OVER_CONSTRAINED at time 0 s in process main Constraints for over-constrained object pkt_c will be ignored. src_addr = 008e6617 dest_addr = 00711f52 length = 64 src_addr = 00755da2 dest_addr = 005a4210 length = 64 src_addr = 0054ca51 dest_addr = 006187a8 length = 64 src_addr = 0065a389 dest_addr = 006fd55e length = 64 src_addr = 0046ce02 dest_addr = 004889e1 length = 64 src_addr = 004a19e6 dest_addr = 0059637b length = 64 src_addr = 00268b9a dest_addr = 001069d1 length = 64 src_addr = 0045c242 dest_addr = 004d6c07 length = 64 src_addr = 004e95ef dest_addr = 005d25a4 length = 64 src_addr = 0042bb4e dest_addr = 00313678 length = 64 最初にエラーがでるけど、とりあえず気にしないでおく. おそらく、Soft Constraintに関するエラーだと思われる. その他の使い方 ランダム生成の停止 例:出力を300に固定 scv_smart_ptr int p( "a" ); p- disable_randomization(); // ランダム生成を停止 p- write( 300 ); // pへ値300を書き込む for (int i=0; i 10; i++) { p- next(); // 更新 printf( "data = %d\n", p- read() ); // 値取得 } data = 300 data = 300 data = 300 data = 300 data = 300 data = 300 data = 300 data = 300 data = 300 data = 300 ランダムの停止は、デバッグ時や直接代入したいときに利用できる. 分布の指定 分布の指定は4種類ある。 RAMDAM 指定分布範囲での一様なランダム生成 SCAN とりうる値で小さいものから大きいものへと生成 RANDOM_AVOID_DUPLICATE 生成可能な数値が出尽くすまで同一の値を生成しない DISTRIBUTION scv_bag<>で確率分布を指定 デフォルト設定では、 p- set_mode( RANDOM ); enum scv_extension_rand_if mode_t 順列型ランダム生成(RANDOM_AVOID_DUPLICATE) SystemVerilogのrandcのように順列型の乱数生成のようにできる。 例:0〜9までの順列型のランダム生成 scv_random set_global_seed(100); scv_smart_ptr int p; p- keep_only(0, 9); p- set_mode( scv_extensions_if RANDOM_AVOID_DUPLICATE ); // 分布の指定 for (int i=0; i 2; i++) { for (int j=0; j 10; j++) { p- next(); printf( "%d\n", p- read() ); } printf( "\n" ); } 実行結果 4 1 8 9 7 2 3 6 0 5 8 2 1 5 0 9 4 6 7 3 参照 scv_smart_ptr<T>(実際に使う関数は_scv_extension_rand_N<T>を参照) scv_bag<T>