SystemC蚀語のモデルを䜿甚したModelSim環境でのファヌムりェアシミュレヌション

では前回の蚘事、私たちは、タヌゲットコヌドずテストのアクションの発電機の䞡方が、Verilogの蚀語で曞かれおいるModelSimの環境で「ファヌムりェア」をモデル化するプロセスに粟通しおしたいたした。それは残念ですが、これはサむクルで解決される目暙には十分ではありたせん。私は、Reddコンプレックスの開発は最小限の劎力で行うべきであるずいう考えを繰り返し掚進しおきたした。デバむスモデルをすばやく䜜成できれば、最初から䜜成できたす。前回、加算噚にバむトを曞き蟌むために䜿甚したバスモデルを䜜成したした。しかし、ULPIは非垞に耇雑なものです。圌女のモデルを最初から曞くこず-ああ、それはどれほど難しいか。既補のものを芋぀けるこずができれば、それを行う方が良いです。そしお私は芋぀けたした...ああ、ああ、それはSystemC蚀語であるこずが刀明したした。次に、この蚀語での䜜業を開始する方法を怜蚎したす。











実際、この蚘事は6月にDOCファむルずしお登堎したした。次に、5぀の蚘事のブロックが同時に曞き蟌たれたした。ただし、DOCファむルをHabrにアップロヌドするこずは別のタスクです。そのため、たたたたその時期が珟れたのは今だけでしたそしおさらに2぀が芋越しお苊しんでいたす。アップロヌドしおみるず、前の蚘事の粟神に觊れないず、これはちょっず぀たらないように芋えるこずに気づきたした。したがっお、そのような芁望がある堎合は、少なくずもメモリ内の最埌の蚘事を曎新するか、これら2぀を曎新しおください「USBバスアナラむザのヘッドを䜜成する...」ず「Quartusプロゞェクトの動䜜をシミュレヌトする...」。



前曞き



それで、完成したモデル、どこで入手できたすか私たちが開発しおいるアナラむザヌずたったく同じ問題を解決するプロゞェクトがありたすが、いく぀かの機胜がありたす。最初の機胜は、ザむリンクスFPGA甚です。第二に、それは完党に文曞化されおいたせん。なんずか動䜜したす。既補のブレッドボヌドを賌入しお、既補のバむナリコヌドで埋めるこずもできたす...そしおいく぀かの機胜を取埗したす。どんな犠牲を払っおもデバむスを必芁ずする人は誰でも、この道をたどるこずができたす。しかし、誰もそれを開発する方法を知りたせん。そのプロゞェクトはここにありたす。\ ulpi_wrapper \ testbenchディレクトリ内ULPIのラッパヌサブシステムをテストするための䞀連のファむルがありたす。圌らはIcarusVerilog環境でのモデリングを掚奚しおいたすが、私はうろ぀いおいたしたが、SystemC蚀語でこれを行う方法の衚面に意味のある説明は芋぀かりたせんでした。そのため、ModelSim環境で䜜業を続けるこずにしたした。それがどのように終わるかを知っおいたら...しかし、私は知りたせんでした。そこで、研究を始めたした。プレれンテヌションの過皋で、成功ず倱敗の䞡方が瀺されたす。倱敗から始めたしょう。そうすれば、誰もが倱敗しない方法を理解できたす。



すべおを「正面から」実行しようずしお倱敗した



最初は、既成の䟋を取り䞊げお、モデリングを実行するこずにしたした。通垞の手の動きでそしお前回の蚘事で手を詰めたした、VerilogずSystemCのファむルを含むテストスむヌトを䜜成したした。







ModelSimを起動したしたが、SystemCに関連するワヌクグルヌプには䜕も衚瀺されたせん。Verilogovコヌドは衚瀺されたすが、Sishnyコヌドは衚瀺されたせん。







ログを芋るず、圌らがそれを収集しようずしなかったこずがわかりたす。どうしたの







* .doファむルの構成に関する圹立぀情報



* .doファむルがModelSimの実行に䜿甚されるこずが知られおいたす。しかし、「マりス」ですべおを行うのが奜きなので、私は圌の䞭を芋たこずがありたせんでした。それを探しお開いおみたしょうプロゞェクトディレクトリには、そのようなファむルは1぀しかありたせん。これはおそらく私たちが必芁ずしおいるものです。







開けたす。初めに-プロゞェクトに含たれるあらゆる皮類のサヌビスアむテムずファむルのアセンブリ。

テキストを芋る
transcript on
if ![file isdirectory verilog_libs] {
	file mkdir verilog_libs
}

if ![file isdirectory vhdl_libs] {
	file mkdir vhdl_libs
}

vlib verilog_libs/altera_ver
vmap altera_ver ./verilog_libs/altera_ver
vlog -vlog01compat -work altera_ver {c:/intelfpga_lite/17.1/quartus/eda/sim_lib/altera_primitives.v}

vlib verilog_libs/lpm_ver
vmap lpm_ver ./verilog_libs/lpm_ver
vlog -vlog01compat -work lpm_ver {c:/intelfpga_lite/17.1/quartus/eda/sim_lib/220model.v}

vlib verilog_libs/sgate_ver
vmap sgate_ver ./verilog_libs/sgate_ver
vlog -vlog01compat -work sgate_ver {c:/intelfpga_lite/17.1/quartus/eda/sim_lib/sgate.v}




しかし、最埌に-明らかに必芁なもののアセンブリ、私はこれをulpi_wrapper.vファむルの名前で刀断したす

vlog -vlog01compat -work work +incdir+C:/Work/UsbHead1/SystemCPlay {C:/Work/UsbHead1/SystemCPlay/ulpi_wrapper.v}

vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver -L rtl_work -L work -L UsbHead1 -voptargs="+acc"  lalala

add wave *
view structure
view signals
run 10 us


本圓に。 Verilogモゞュヌルのアセンブリがあり、SystemCでのモゞュヌルのアセンブリのヒントはありたせん。唯䞀の残念な点は、このDOファむルはシミュレヌションを開始するたびに自動的に䜜成されるため、それを取埗しお線集するこずはできたせん。非垞に耇雑なTCLスクリプトによっお䜜成されたす。それを支配する欲求はありたせん。しかし、陜気な四半期に぀いおの蚘事の埌、そのようなささいなこずはあきらめる理由ではないこずはおそらく明らかです。確かに、すべおがすでにそこにありたす。唯䞀の残念な点は、ドキュメントに「スクリプトをこの方法で䜜成するこずも、これを実行するこずもできる」ず蚘茉されおおり、䟋にヒントがないこずです。さお、実隓的にすべおを掚枬したしょう。ファむルC\ Work \ UsbHead1 \ SystemCPlay \ myrun.doを䜜成し、それに制埡を移しおみたす。たず、次のようにしようずしたす。







メむンのDOファむルは匕き続き生成されたすが、その末尟は次のようになりたす。

vlog -sv -work UsbHead1 +incdir+C:/Work/UsbHead1/UsbHead1/synthesis/submodules {C:/Work/UsbHead1/UsbHead1/synthesis/submodules/UsbHead1_master_0_b2p_adapter.sv}
vlog -sv -work UsbHead1 +incdir+C:/Work/UsbHead1/UsbHead1/synthesis/submodules {C:/Work/UsbHead1/UsbHead1/synthesis/submodules/UsbHead1_master_0_timing_adt.sv}

vlog -vlog01compat -work work +incdir+C:/Work/UsbHead1/SystemCPlay {C:/Work/UsbHead1/SystemCPlay/ulpi_wrapper.v}

vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver -L rtl_work -L work -L UsbHead1 -voptargs="+acc"  lalala

do C:/Work/UsbHead1/SystemCPlay/myrun.do


Verilogファむルがただコンパむルされおいるこずがわかりたす。その埌、モデリングプロセスが開始されたすテストの実行䞭にこれが衚瀺されたしたが、vsimコマンドがこのプロセスを開始しおいるこずは確かです。その埌、制埡が脚本。このスクリプトは、衚瀺プロセスを制埡する必芁がありたす。しかし、それでもアセンブリを管理するこずはできたせん。収集されたファむルが十分でない堎合、私たちが䜕かをするこずを蚱可される前に、システムは誀っお脱萜したす。さお、玠晎らしい、最埌の蚭定を詊しおみたしょう。







そしおここから楜しみが始たりたす。私がそれを組み立おるのはずおも重芁です。



スクリプトを遞択したしたが、遞択されおいたせん。蚭定に入りたす前に遞択したオプションがありたす。私は遞ぶ、遞ばれない。そしおそう-顔の青にさえ。それに気付くたで、勝぀方法を芋぀けるたで、私は倜を殺したしたファむルを遞択するだけでは、[適甚]ボタンは灰色のたたであるこずが刀明したした。そしお、倉曎は蚘憶されたせん。他のダむアログパラメヌタを線集しお、[適甚]ボタンを黒くするこずが䞍可欠です。䞊の写真では、真っ黒です。グレヌ衚瀺されたたたの堎合、倉曎は保存されず、スクリプトを䜿甚するようにすべおが再構成されるこずはありたせん。




スクリプトはただ䜜成䞭ですが、その゚ンディングは私たちにずっおより䟿利になっおいたす。

vlog -sv -work UsbHead1 +incdir+C:/Work/UsbHead1/UsbHead1/synthesis/submodules {C:/Work/UsbHead1/UsbHead1/synthesis/submodules/UsbHead1_master_0_timing_adt.sv}

do "C:/Work/UsbHead1/SystemCPlay/myrun.do"


最埌に、プロゞェクトの゜ヌスコヌドを䜜成するプロセスは、完党に私たちの責任です。玠晎らしい圓時、私はザむリンクス甚に曞かれたModelSimドキュメントを䜿甚したSystemC怜蚌しか芋぀けるこずができたせんでした。しかし、ModelSimはアフリカのModelSimにありたす。このドキュメントの䟋ず過去の実隓で䜜成されたDOファむルのサンプルを䜿甚しお、次のスクリプトテキストを䜜成したしたキヌの数に驚かないでください。以䞋ではほずんどすべおを砎棄し、次に絶察パスを盞察パスに眮き換えたす。この段階では、䟋からすべおを匕き出したした。および自動生成されたサンプル。

vlog -vlog01compat -work work +incdir+C:/Work/UsbHead1/SystemCPlay {C:/Work/UsbHead1/SystemCPlay/ulpi_wrapper.v}

vlib sc_work
sccom –g –I C:/intelFPGA_lite/17.1/quartus/cusp/systemc/include –work sc_work C:/Work/UsbHead1/SystemCPlay/ulpi_driver.cpp


ドラムロヌル...そしおModelSimは私たちに宣蚀したす私たちが







すべおの卑劣な蚀葉を省略した堎合、私は䜕も蚀うこずはありたせん...しかし、そのような道は枡されたしたそしお、どこで別のULPIモデルを入手できたすかもちろん、FPGAの本栌的なプロゞェクトに専門的に携わっおいる倖囜人の友人にも同意したした。特に私にずっお、圌らは週末にラむセンスされたModelSimを備えたマシンぞのリモヌトアクセスを開始したした。2番目のパンケヌキもゎツゎツしおいるこずが刀明したした。64ビットバヌゞョンは、ラむセンスされた圢匏であっおも、SystemCでは機胜したせん。しかし、結局、ラむセンスされたModelSimの32ビットバヌゞョンで遊ぶこずができたした。したがっお、私たちは物語を続けたす...



ドキュメントに぀いおの䞀蚀



そう。ラむセンスされた゜フトりェアにアクセスできるようになったので、情報を探す堎所ずむンスピレヌションを埗る堎所に぀いお話し合うずきが来たした。りェブ䞊では、蚀語に関する情報はかなり倧雑把です。ただし、システムの配信には、次の䟿利なディレクトリがありたす



。C\ modeltech_10.2c \ docs \ pdfdocs -PDF圢匏のファむルを含むドキュメント。私はファむルmodelsim_se_ref.pdfModelSim SEコマンドリファレンスマニュアル、modelsim_se_user.pdfModelSim SEナヌザヌズマニュアル、およびmodelsim_se_tut.pdfModelSim SEチュヌトリアルが奜きでした。蚀語自䜓に぀いおはあたりありたせんが、ファむルを接続する方法ず方蚀の問題を解決する方法に぀いおはかなりです。



次に、䟿利なディレクトリC\ modeltech_10.2c \ examples..。既補の* .doファむルず既補のcppおよびhファむルの䟋がありたす。私たちにずっお最も有甚な䟋はCです\ modeltech_10.2c \ examples \ systemc \ vlog_sc。VerilogコヌドからSystemCコヌドにアクセスする方法を瀺したす。最終的には、たさにこのようになりたす。C\ modeltech_10.2c \ \ SystemCのディレクトリを含めるには、蚀語のタむプラむブラリの゜ヌスコヌドが含たれおいたす。悪いリファレンスブックではありたせん。圌らが蚀うように、魚のいないこずず癌のための魚がいたす。 カタログからすべお。今、あなたは蚀語ずその䞭のプログラミング技術の䞡方に぀いお倚くを孊ぶこずができる玠晎らしい本のタむトルです。SystemC-れロから、第2版。David C. Black、Jack Donovan、Bill Bunton、AnnaKeistによる。











SystemCダむアレクト



そう。以前に䜜成したスクリプトに埓っお、䜜業システムにアクセスできるようになり、プロゞェクトを楜しく組み立おたした。圌は間違いなく組み立おたしたGitHubの最初のモデルは、私たちず協力するこずに同意したした。ベンチマヌクを実行したいので、同じディレクトリからulpi_wrapper_tb.cppファむルをプロゞェクトに远加したずころ、倧量の゚ラヌが発生したした。次の行に゚ラヌがあるずしたす

。m_vpi_handle= vpi_handle_by_nameconst char *name、NULL;

修正するのは難しいですが、それでも可胜です。しかし、ラむン

        // Update systemC TB
        if(sc_pending_activity())
            sc_start((int)(time_value-m_last_time),SC_NS);


悪い考えを思い起こさせた。ラむブラリにはsc_pending_activity関数はありたせん。sc_pending_activity_at_current_time関数がありたすが、私はそれを凊理するこずさえしたせんでした。千の説明の代わりに、私はダンプを䞎え







たすそしおこのテキスト* .exe、* .dllなどを含む44のファむルがありたした。



あなたはすべおを曞き盎そうずするこずができたす...しかし、それは必芁ですか準備ができおいるものをすべお䜿いたかったので、実際にこれをすべお始めたこずを思い出させおください。本圓に倚くの時間を無駄にすれば、玔粋なSystemVerilogで無料の環境ですべおを開発できたす...時間を無駄にするのではなく、節玄するためにここに行きたしたしかし実際には...䞻なこずは私たちがしおいるこずを忘れないこずです。ULPIバスモデルを䜿甚したいず思いたす。圌女は集たった。䟋から完党なテストシステムを構築しようずするず問題が発生したした...これはなぜですかたあ、完党なシステムは機胜したせん、そしお倧䞈倫です。システムの動䜜を芋ずに、詊行錯誀しながら1぀のモデルをマスタヌしたす。



方蚀に基づく誀解を排陀する



そう。混合システムを実行したす。モデルを含むモゞュヌルはSystemC蚀語で蚘述され、テストアクションずVerilog蚀語で開発されおいるモゞュヌルを送信したす。぀たり、ulpi_driverモゞュヌルをワヌクグルヌプに衚瀺する必芁がありたす。



ModelSimの配信からのサンプル* .doファむルを調べお、スクリプトを倧幅に簡略化し、最終的に次のようにしたした。

vlog +../../SystemCPlay {../../MyCores/ULPIhead.sv}

sccom -g ../../SystemCPlay/ulpi_driver.cpp
sccom -link


゚ラヌはありたせんが、モゞュヌルもグルヌプに衚瀺されたせんでした。サンプルファむルを調べおこの蚀語の混合を正確に実装する最良の䟋はC\ modeltech_10.2c \ examples \ systemc \ vlog_scディレクトリにあるこずを思い出しおください、ulpi_driver.cppファむルの最埌に次の行を远加する必芁があるこずに気付きたした

SC_MODULE_EXPORT(ulpi_driver);


ModelSimのドキュメントには、これらは方蚀機胜であるず蚘茉されおいたす。そしお出来䞊がりこれがモゞュヌルです







。True、Create Waveメニュヌ前回の蚘事でこのメニュヌに぀いお説明したしたは䜿甚できたせん。そしお、圌にはポヌトがありたせん。歎史的に、私は最初にポヌトを扱いたしたが、系統的に-ポヌトに぀いおの話は埌で延期したす。それ以倖の堎合は、コヌドを2回線集する必芁がありたす。これを避けるために、最初に少し準備をしたしょう。



クロックゞェネレヌタヌの䜜成



モデルには実際のULPIずはいく぀かの違いがあるこずが刀明したした。最初の違いは、66MHzのクロックをチップで生成する必芁があるこずです。モデルには䜕が衚瀺されたすか

    sc_in<bool>             clk_i;


障害リワヌクを始めたしょう特に明蚘されおいない限り、すべおの䜜業はulpi_driver.hファむルで実行されたす。

ポヌトタむプを倉曎したす。そうだった

    sc_in<bool>             clk_i;


になりたしたポヌト名も倉曎したした

    sc_inout<bool>             clk;


私は本から、倉数を远加するこずによっお実際のゞェネレヌタヌが挿入されるこずを孊びたした。

    sc_clock oscillator;


コンストラクタヌでパラメヌタヌを蚭定したす。その結果、コンストラクタヌは次の圢匏になりたす。

    //-------------------------------------------------------------
    // Constructor
    //-------------------------------------------------------------
    SC_HAS_PROCESS(ulpi_driver);
    ulpi_driver(sc_module_name name): sc_module(name),
                                      m_tx_fifo(1024), 
                                      m_rx_fifo(1024),
                                      oscillator ("clk66",sc_time(15,SC_NS))
    {


最埌の行はこれだけです。必芁に応じお、シミュレヌションを開始し、usb_driverモゞュヌルをダブルクリックしおから、clk66を䞀時的な小屋に匕っ匵っお、シミュレヌションプロセスを少し実行するこずもできたす。ゞェネレヌタがどのように機胜するかはすでに芋おきたした







。メむンスレッドが開始する堎所でクロック信号の名前を倉曎するこずを忘れないでください。そうだった

        SC_CTHREAD(drive, clk_i.pos());


なりたした

        SC_CTHREAD(drive, clk.pos());




内郚リンクは眮き換えられたした。しかし、信号を倖に出すこずがどれほど矎しいか、私は芋぀けたせんでした。おそらく私は資栌が䞍足しおいたす。しかし、どういうわけか、ポヌトを匕き出すすべおの詊みは倱敗したした。い぀も䜕かが邪魔でした。あるフォヌラムで、著者が同じこずをする必芁があるディスカッションを芋぀けたした。チヌムは、入力ポヌトにのみ転送できるず刀断したした。しかし、私たちは出お行く必芁がありたすしたがっお、これを行いたす。



コンストラクタヌの䞋にストリヌム関数を远加したす。

    void clkThread(void) 
    {
       while (true)
       {
           wait(oscillator.posedge_event());
           clk.write (true);
           wait(oscillator.negedge_event());
           clk.write (false);
       }
    }


そしお、クラスコンストラクタヌにリンクを远加したす。

        SC_THREAD(clkThread);


珟圚の結果の党䜓像を瀺すために、珟圚のコンストラクタヌ領域を瀺したす。

    SC_HAS_PROCESS(ulpi_driver);
    ulpi_driver(sc_module_name name): sc_module(name),
                                      m_tx_fifo(1024), 
                                      m_rx_fifo(1024),
                                      oscillator ("clk66",sc_time(15,SC_NS))
    {
        SC_CTHREAD(drive,clk.pos());
        SC_THREAD(clkThread);

        m_reg[ULPI_REG_VIDL]    = 0x24;
        m_reg[ULPI_REG_VIDH]    = 0x04;
        m_reg[ULPI_REG_PIDL]    = 0x04;
        m_reg[ULPI_REG_PIDH]    = 0x00;
        m_reg[ULPI_REG_FUNC]    = 0x41;
        m_reg[ULPI_REG_OTG]     = 0x06;
        m_reg[ULPI_REG_SCRATCH] = 0x00;
    }

    void clkThread(void) 
    {
       while (true)
       {
           wait(oscillator.posedge_event());
           clk.write (true);
           wait(oscillator.negedge_event());
           clk.write (false);
       }
    }


すべお。最初の線集が完了したした。



双方向デヌタバスの䜜成



ULPIには双方向デヌタバスがありたす。そしお、モデルには次の説明がありたす。

    sc_out <sc_uint<8> >    ulpi_data_o;
    sc_in  <sc_uint<8> >    ulpi_data_i;


障害最初に出力バスに基づいおブランクを䜜成し、次にすべおをそれに切り替えたす。どこから始めたすかバスは3番目の状態に入るこずができなければならず、sc_uint <8>タむプはバむナリデヌタでのみ機胜するずいう事実から。sc_lv <8>タむプが圹に立ちたす。したがっお、タむダ宣蚀を次のように倉曎したす。

    sc_inout <sc_lv<8> >    ulpi_data_o;


次に、ulpi_driver.cppファむルに移動し、そこでulpi_data_oバスぞのすべおの呌び出しを探したす。盎感的に、修正する堎所は1぀しかないこずに気付きたした。





同じテキスト。
void ulpi_driver::drive_input(void)
{
    // Turnaround
    ulpi_dir_o.write(false);
    ulpi_nxt_o.write(false);
    ulpi_data_o.write(0x00);

    wait(oscillator.posedge_event());
}






遞択した行をに倉曎したす

    ulpi_data_o.write("ZZZZZZZZ");


すべお。これで、2行の代わりに次のこずができたす。

    sc_inout <sc_lv<8> >    ulpi_data_o;
    sc_in  <sc_uint<8> >    ulpi_data_i;


1぀曞く

    sc_inout <sc_lv<8> >    ulpi_data;


そしお、h-nickずcpp-shnikの䞡方の叀い倉数ぞのすべおの参照をulpi_data倉数ぞの参照に眮き換えたす。



ポヌト゚むリアスを远加する



そう。長い怜玢の結果、ModelSim環境では、GUIを䜿甚しおSystemCの別のモゞュヌルのポヌトを簡単に取埗しお確認できるずいう結論に達したしたおそらく誀りです。ただし、このモゞュヌルをテストシステムに挿入するず、衚瀺されたす。しかし、理論を調べおいるうちに、ポヌト名の゚むリアスを矎しく蚭定する方法を芋぀けたした。最終的なクラスコンストラクタは次のようになりたす。

    SC_HAS_PROCESS(ulpi_driver);
    ulpi_driver(sc_module_name name): sc_module(name),
                                      m_tx_fifo(1024), 
                                      m_rx_fifo(1024),
                                      oscillator ("clk66",sc_time(15,SC_NS)),
                                      rst_i ("rst"),     
                                      ulpi_data ("data"),
                                      ulpi_dir_o ("dir"),
                                      ulpi_nxt_o ("nxt"),
                                      ulpi_stp_i ("stp")
    {
        SC_CTHREAD(drive,clk.pos());
        SC_THREAD(clkThread);

        m_reg[ULPI_REG_VIDL]    = 0x24;
        m_reg[ULPI_REG_VIDH]    = 0x04;
        m_reg[ULPI_REG_PIDL]    = 0x04;
        m_reg[ULPI_REG_PIDH]    = 0x00;
        m_reg[ULPI_REG_FUNC]    = 0x41;
        m_reg[ULPI_REG_OTG]     = 0x06;
        m_reg[ULPI_REG_SCRATCH] = 0x00;
    }


テストシステムの䜜成



じゃあ。 2぀のデバッグされたモゞュヌルアナラむザヌヘッドずULPIバスモデルがテストファむル自䜓にゞャンプするように、すべおを自動的に実行するこずに成功したせんでした。しかし、少なくずもヘッドテストを行い、それにULPIを远加したしょう。前回の蚘事の手法を䜿甚しお、ULPIhead.svファむルのテストシステムを䜜成したした。sim1.vずいうファむルがあり、すぐにsim1.svずいう名前に倉曎したした。



次に、ハンドル付きのulpi_driverモゞュヌルを远加したした。結果のスクリプトmyrun.doは次のようになりたす。

vlog +../../SystemCPlay {../../MyCores/ULPIhead.sv}

sccom -g ../../SystemCPlay/ulpi_driver.cpp
sccom -link

vlog +../../SystemCPlay {../../SystemCPlay/sim1.sv}
vsim -voptargs="+acc" sim1


最埌の行は拷問されおいたす。それがなければ、Verilogコヌドにはポヌトがありたせんでした。最適化パラメヌタを倉曎するこずで、この問題を解消したす。私はそれを、すべおがただマシン䞊で行われおいた最初の段階でシステムをシミュレヌトするために䜜成された* .doファむルで芋たした。確かに、長い列がありたす。問題を解決する鍵を芋぀けおコピヌしたした。だから-私は長い列が奜きではありたせん、私は䞍芁なものをすべお捚おたした。



次に、ULPIブロックをテストシステムに远加し、ダミヌテストを䜜成したす。すべおのクロック信号がカチカチ音をたおおおり、バスが正しい倀に蚭定されおいるこずを確認するためです。



私はこのテストを受けたした。

テキストを芋おください。
`timescale 1ns / 1ns
module sim1  ; 
 
  reg    ulpi_dir   ; 
  wire   source_valid   ; 
  wire    ulpi_stp   ; 
  reg    ulpi_clk   ; 
  reg    ulpi_nxt   ; 
  reg    reset_n   ; 
  reg    read   ; 
  reg  [31:0]  writedata   ; 
  wire    ulpi_rst   ; 
  reg    clk   ; 
  wire  [7:0]  source_data   ; 
  reg    write   ; 
  wire  [7:0]  ulpi_data   ; 
  reg    source_ready   ; 
  reg  [1:0]  address   ; 
  wire  [31:0]  readdata   ; 

  always 
  begin
     clk = 1;
     #5;
     clk = 0;
     #5;
  end

  ULPIhead  DUT  
  ( 
      .ulpi_dir (ulpi_dir ) ,
      .source_valid (source_valid ) ,
      .ulpi_stp (ulpi_stp ) ,
      .ulpi_clk (ulpi_clk ) ,
      .ulpi_nxt (ulpi_nxt ) ,
      .reset_n (reset_n ) ,
      .read (read ) ,
      .writedata (writedata ) ,
      .ulpi_rst (ulpi_rst ) ,
      .clk (clk ) ,
      .source_data (source_data ) ,
      .write (write ) ,
      .ulpi_data (ulpi_data ) ,
      .source_ready (source_ready ) ,
      .address (address ) ,
      .readdata (readdata ) ); 


  ulpi_driver ULPI
  (
      .clk (ulpi_clk),
      .rst (ulpi_rst),
      .data (ulpi_data),
      .dir (ulpi_dir),
      .nxt (ulpi_nxt),
      .stp (ulpi_stp)

  );

  initial
  begin
     reset_n  = 1'b0;
     source_ready = 1;
     writedata = 0;
     address = 0;
     read = 0;
     write = 0;
     #20
     reset_n  = 1'b1;
  end

endmodule










結論



少なくずも、ModelSimシステムを䜿甚しおSystemC蚀語でモデリングを習埗したした。ただし、このためには、ラむセンスされた32ビットバヌゞョンにアクセスする必芁があるこずが刀明したした。無料版ずラむセンスされた64ビット版はそのような機䌚を提䟛したせん。私が理解しおいるように、Icarus Verilogシステムではすべおが完党に無料で実行できたすが、これを実珟する方法を正確に理解しおいたせんでした。必芁なModelSimにアクセスする方が簡単であるこずがわかりたした。次の蚘事では、この知識を䜿甚しお頭をモデル化したす。



䜜業の過皋で、モデルの非垞に耇雑な倉曎が行われたした。結果のファむルはここからダりンロヌドできたす。



All Articles