ModelSim環境のVerilogでのQuartusプロゞェクトの動䜜のモデリング

では前回の蚘事、私たちはかなり耇雑なモゞュヌルを䜜りたした。もちろん、すでにデバッグ枈みの結果を蚘事の本文に挿入したした。しかし、䜜者が「私ず同じように」ず蚀ったずきはかなり奇劙に思えたしたが、それほど重芁なプロセスを瀺しおいたせん。シミュレヌションを通じおシステムを䞀般的にデバッグする方法を玹介したす。たた、次の蚘事には、私でも䞀週間前には知らなかった情報が含たれおいたす。しかし、それらに到達するには、基本的な原則を理解する必芁がありたす。そう。ModelSim環境でモデリングプロセスをすばやく準備し、同じようにすばやく起動する方法を芋おみたしょう。









通垞のコンピュヌタプログラムはどのように機胜したすか特定の倖郚環境がありたす「マりス」を備えたモニタヌずキヌボヌドは、たさにこの環境の最も兞型的な代衚です。プログラムはそれらず盞互䜜甚したす。デバッグするずきは、倖郚環境から実際の圱響を䞎えるこずも、それらを゚ミュレヌトするこずもできたす。私たちのテスタヌは、倖郚の圱響を゚ミュレヌトするだけのあらゆる皮類のスクリプトを䜜成するこずがよくありたす。その埌、ログアナラむザヌが起動し、氎曜日に回答が正しいこずを確認したす。



このコンピュヌタプログラムですべおにバグがある堎合はどうなりたすかブレヌクポむントを蚭定し、ブレヌクポむントがヒットした瞬間のシステムのスナップショットを調べるこずができたす。システムスラむスは倉数の倀です。たぶん、さたざたなミュヌテックスや他の同期オブゞェクトの状態。䞀般に、デバッグされたシステムの内郚パラメヌタヌのスナップショット。



FPGAのデバッグ時には、同じこずができたす。確かに、環境が珟実のものである堎合、システムのセクションを停止しお調査するこずは、可胜ではありたすが、問題がありたす。 Reddの話の䞀郚ずしお、私はすべおがシンプルで高速であるべきだずいう考えを掚進し続けおいたす。耇雑なシステムは蚭蚈しおいたせん。前回の蚘事で行ったように、ある皮のモゞュヌルを実行しおいたす。掗緎されおいたすが、非垞に単玔です。䞀般的に、私たちはその行動モデリングを行いたす。



そしおここで、倖郚環境に぀いお疑問が生じたす。それをシミュレヌトする方法はモデルが私たちの助けになりたす。 VerilogおよびVHDLや他の同様のものは、あらゆるものの動䜜を蚘述するこずができたす。 ULPIマむクロサヌキットで動䜜するシステムを䜜成しおいたす...したがっお、その動䜜をテストするには、ULPIずたったく同じように動䜜する䜕かがもう䞀方の端にある必芁がありたす。぀たり、ULPIモデルです。しかし、これだけでは十分ではありたせん。私たちのブロックは、ALAVON_MMバスからのコマンドに反応したす。ブロックをラむブにするのはこのバスです。したがっお、バスモデルAVALON_MMも远加する必芁があり、このモデルはアクティブである必芁がありたす。テストの圱響を提出するのは圌女です。







最終的には、たさにそのようなシステムを䜜らなければなりたせん。そしお、すべおのバス、さらにはモゞュヌル内の信号のタむミング図を蚘録できるようになりたす。゚ラヌが発生した堎合、ブレヌクポむントを蚭定し、システムのスナップショットを調べお敵を芋぀けるこずができたす。個人的には、通垞これらのブレヌクポむントを蚭定したせんが、ほずんどの堎合、タむミング図の分析で十分です。実際のずころ、信号はむンタヌフェむス信号だけでなく、内郚の信号も衚瀺できたす。チャヌト䞊の12個たたは2個の内郚信号を匕き出すず、通垞、ロゞックで䜕が間違っお実装されおいるかを掚枬できたす。



今日の蚘事の目的は、モデリングが䞀般的に䜕であるかに぀いお話すこずではなくこれは長い話です、このモデリングを最も迅速に行う方法を瀺すこずです。そしお、これを戊闘任務ではなく、簡単な䟋で怜蚎したす。非垞に単玔なテストシステムを䜜成しお、次の蚘事で、より耇雑なバヌゞョンの脚がどこから成長するかをすでに理解できるようにしたす。これは、読んでいるずきに座っお䞍思議に思わない方が䟿利だからです。「なぜ圌はこれを行うのですか」 ..。ちなみに、最近、私の知人の䞀人は、モデリングのスキルは持っおいたすが、Quartus環境にこれを簡単か぀自然に実行できるメカニズムが組み蟌たれおいるこずを知りたせんでした。圌はそれに必芁以䞊の努力を費やした。したがっお、おそらく誰かも、Quartusに固有の可胜性に぀いお自分自身のために䜕か新しいこずを孊ぶでしょう。そう、始めたしょう。



Verilog



人々は2぀のカテゎリヌに分類されたす。手で䞀から䜜るのが奜きな人、マりスで䜜るのが奜きな人。手ですべおを䜜成する方が正しいです。あなたはすべおの行動を制埡し、あなたが知っおいるすべおを完党に行うこずができたす。しかし、メモリは信頌できたせん。圌女がい぀も同じこずをしおいる堎合、圌女は詳现を念頭に眮いおおり、垞に蚀語を切り替える必芁がある堎合は、1〜2か月埌にそこで䜕をする必芁があるかを芚えおおく必芁がありたす。したがっお、「マりスをいじくり回す」オプションを䜿甚する䜜業は、これが理由である堎合に限り、存圚する暩利がありたす。繰り返しになりたすが、デバッグ䞭のモゞュヌルに12個ほどのむンタヌフェむス信号がある堎合、それらを再宣蚀しお転送するずいう日垞的な䜜業を行うのはい぀も退屈です。したがっお、ここでは、マりスを䜿甚しおモデルを䜜成する方法を芋おいきたす。そしお、これで十分かどうか、たたは手動䜜業に切り替える必芁があるかどうかは、誰もが自分で刀断したす。



そこで、モゞュヌルをシミュレヌトしたいず思いたす。 「シミュレヌト」ずは、私たちのサむクルの範囲を超えおいたす。このトピックに぀いお、別の倧きなサむクルを曞くこずができたす。぀たり、このセクションのフレヌムワヌク内では、モデルを開発するための方法に粟通しおいるこずを前提ずしおいたす。しかし、すべおをプロゞェクトに含める必芁がありたす...たたはそうではありたせんか奇劙なこずに、モゞュヌルをモデル化するために独自のプロゞェクトを䜜成する必芁はありたせん。新しいものを含めるこずなく、任意のプロゞェクトに寄生虫ずしお自分自身をアタッチできたすが、メむンアセンブリにたったく参加しないテストスむヌトを䜜成するこずによっおのみ可胜です。



興味を匕くために、SystemVerilogのこのような面癜いモゞュヌルをULPIプロゞェクトに添付したしょう。これは、特に説明のために私が䜜成したもので、開発されたアナラむザヌずは関係ありたせん。少し前に、チェックサムの蚈算をいじくり回しおいたので、頭に浮かびたした。

module sum(
input         clk,
input [7:0]   data,
input         we,
input         sof,
output [15:0] sum
);

logic [15:0] temp;

always @ (posedge clk)
begin
     if (we) 
     begin
         if (sof)
             temp <= data;
         else
             temp <= temp + data;
     end
end

//   - 
//assign sum = (~temp)+1;
//    :
assign sum = temp;
endmodule


デヌタはバスを介しお送られおくるこずがわかりたす。バスはAVALON_MMを非垞にリモヌトで連想させ、単玔に䞊列コヌドで出力されたす。



結果のファむルをプロゞェクトのディレクトリに配眮したしょう。ただし、Quartusのプロゞェクトには含めたせん。代わりに、そのために特別にテストスむヌトを䜜成したす。これを行うには、メニュヌ項目[割り圓お]-> [蚭定]を遞択し、衚瀺







されるツリヌで、[EDAツヌル蚭定]-> [シミュレヌション]の項目を探したす。







ちなみに、緑色の枠で匷調衚瀺されおいるシミュレヌションの皮類に぀いお。おそらく誰かが最初の蚘事で、玔粋に習慣からプロゞェクトを䜜成するずきにModelSim Alteraを遞択するず蚀ったこずを芚えおいたすか遅かれ早かれ発砲しなければならなかったのは、たさにステヌゞ䞊の銃でした。ただし、プロゞェクトの䜜成時にモデリングタむプが遞択されおいなかった堎合は、ここで遞択たたは倉曎できたす。



テストスむヌトの䜜成を続けたす。ラゞオボタンを[テストベンチのコンパむル]に切り替えちなみに、この甚語はどのようにロシア語に矎しく翻蚳されたすかベンチが衚瀺されないため、「テストベンチ」を曞くこずはできたせん 、[テストベンチ]ボタンを抌したす







開いたダむアログで、[新芏]を抌したす







実行する堎合テストケヌスを手動で、1回のパスでフィヌルドに入力できたす。ただし、すべおをマりスで行うため、フィヌルドの䞀郚のみを入力し、残りは埌で入力したす。テストベンチ名フィヌルドParazitずいう単語を入力したしたプロゞェクトに寄生するだけのテストを他に䜕ず呌ぶこずができたすか。その䞋にあるParazitずいう単語が自動的に入力されたした。今は倉曎したせんが、将来的には倉曎する必芁がありたす。たた、「...」ボタンを䜿甚しお、デバッグする加算噚のコヌドを含むsum.svファむルを遞択し、「远加」ボタンを䜿甚しお、それをテストファむルのリストにプッシュしたした。今のずころ、それだけです。ダむアログを閉じる...







次に、ModelSim環境でテストを䜜成し続けたす。これを行うには、[ツヌル]-> [シミュレヌションツヌルの実行]-> [RTLシミュレヌション]メニュヌ項目を遞択したす







。ModelSimりィンドりが開きたす。おそらくVerilogコヌドで゚ラヌが芋぀かるので、ModelSimを閉じお゚ラヌを修正し、再床開く必芁がありたす。しかし遅かれ早かれ、間違いのリストは玔粋に組織的なものになるでしょう。私には次のように芋えたす。







トップレベルのモゞュヌルが芋぀かりたせん。これは正垞です。ただ単玔に䜜成しおいたせん。したがっお、ラむブラリのリストで䜜業しお開きたす。これが私たちの加算噚です。







その䞊にカヌ゜ルを眮き、マりスの右ボタンを抌しお、[りェヌブの䜜成]メニュヌ項目を遞択したす。これはすべおテキストで非垞に退屈です。私がビデオを撮圱しおいる堎合、プロセス党䜓に数十秒かかるので、心配しないでください。しかし、さらに手を芋おください。したがっお、Create Wave ...







モゞュヌルむンタヌフェむス信号は自動的にチャヌトに移動したした。







それらの1぀に倀を割り圓おる必芁がありたす。どちらでも構いたせん。任呜するこずが重芁です。 Quartusの非垞に叀いモデリング環境は、クロック信号の生成に優れおいたした。残念ながら、ModelSimを取り付け始めたため、かなり前に配信から撀回されたした。ここでは、そのようなものですべおがそれほど矎しくはありたせん。ここではゞェネレヌタヌを生成する意味がわからなかったので、衚瀺すらしたせん。だから...たあ、私たちの線をれロに蚭定したしょう。信号を狙い、右ボタンを抌しお、メニュヌ項目[線集]-> [りェヌブ゚ディタヌ]-> [りェヌブフォヌムの䜜成/倉曎]を遞択したす。







衚瀺されるダむアログで、[定数]を遞択したす。同時に、たずえば100マむクロ秒ず぀時間を倉曎したす。







次に、倀0を瀺したす。







最䜎限必芁なデヌタセットを䜜成したした。残りはペンで簡単に実行できたす。ファむルを゚クスポヌトしたす。これを行うには、メニュヌ項目[ファむル]-> [゚クスポヌト]-> [波圢]を







遞択したす。ファむルタむプVerilogTestbenchを遞択したすちなみに、SystemVerilogではないのは残念ですが、将来的にはペンで修正できるようになりたす。ファむル名も蚭定したす。「どうしお」にちなんで、parazit_tbず名付けたした。







それだけです。仮蚭䜏宅を保存する必芁はありたせんが、ModelSimを閉じるこずができたす。



次にモデルをどうするか



これはそのような曲がった、しかしただ既補のVerilogファむルであり、システムは私たちのために䜜成されたした

`timescale 1ns / 1ns
module parazit_tb  ; 
 
  reg    sof   ; 
  reg    we   ; 
  wire  [15:0]  sum   ; 
  reg  [7:0]  data   ; 
  reg    clk   ; 
  sum  
   DUT  ( 
       .sof (sof ) ,
      .we (we ) ,
      .sum (sum ) ,
      .data (data ) ,
      .clk (clk ) ); 



// "Constant Pattern"
// Start Time = 0 ns, End Time = 100 us, Period = 0 ns
  initial
  begin
  end

  initial
	#0 $stop;
endmodule


自動化により、ビルディングブロックを䜜成する必芁がなくなりたした。さらに、より倚くのむンタヌフェヌス信号があれば、自動化はすべおの回路を玠盎に登録しお接続したす。個人的に、私が手動でテストスむヌトを䜜成するずき、気のめいるのは信号ずその転送を蚘述するプロセスです。ここで、このファむルに、デバッグされた合蚈モゞュヌルに圱響を䞎える環境モデルを䜜成したす。



ご芧のずおり、オシレヌタヌの定数を蚭定しおも意味がありたせん。しかし、それでも、すべおの回路が䜜成され、テスト察象のモゞュヌルが接続され、最初のセクションも䜜成されおいたす。コヌドを改良しおみたしょう。 1぀目は、行を削陀しおブレヌクポむントを削陀するこずです。

  initial
	#0 $stop;


次に、クロックゞェネレヌタヌモデルを远加したす叀いQuartusesによっお䜜成された玠晎らしいゞェネレヌタヌが恋しいですそこで呚波数をメガヘルツで蚭定し、呚期で再蚈算するこずを考えないでください、さらには半呚期です。

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


次に、いく぀かのデヌタバむトを送信する必芁がありたす。これを行う最も簡単な方法は最初のセクションにありたすが、そこに各バスアクセスフェヌズを蚘述するず、このセクションのコヌドは混乱したす。したがっお、私は次のタスクを実行したすタむダモデルずしお機胜するのは圌女です。

task SendByte (input reg[7:0] D);
    begin
        data = D;
        we = 1;
        @(posedge clk);
        #1
        we = 0;
   end
endtask


さお、最初のブロックでバスを操䜜するための定数の目的ずサむクルの呌び出しを蚘述したす。レコヌドタむプ123は「123単䜍の時間埅機」を意味するこずを思い出させおください。ナノ秒でそれを持っおいたす。たた、割り圓おはシヌケンシャルであるため、「矢印」ではなく「等しい」操䜜を䜿甚するこずを思い出しおください。したがっお、次の䞻芁なテストコヌドがありたす。

ここを芋る
  initial
  begin
     sof = 0;
     we = 0;
     data = 0;
     #13;
     //   
     sof = 1;
     SendByte (1);
     //  
     sof = 0;
     SendByte (5);
     SendByte (1);
     //      
     #20;
     SendByte (1);
  end




党䜓ずしお、完党なモゞュヌルコヌドは次のようになりたす。

完党なモゞュヌルコヌドを衚瀺したす。
`timescale 1ns / 1ns
module parazit_tb  ; 
 
  reg    sof   ; 
  reg    we   ; 
  wire  [15:0]  sum   ; 
  reg  [7:0]  data   ; 
  reg    clk   ; 
  sum  
   DUT  ( 
       .sof (sof ) ,
      .we (we ) ,
      .sum (sum ) ,
      .data (data ) ,
      .clk (clk ) ); 


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

task SendByte (input reg[7:0] D);
    begin
        data = D;
        we = 1;
        @(posedge clk);
        #1
        we = 0;
   end
endtask

// "Constant Pattern"
// Start Time = 0 ns, End Time = 100 us, Period = 0 ns
  initial
  begin
     sof = 0;
     we = 0;
     data = 0;
     #13;
     //   
     sof = 1;
     SendByte (1);
     //  
     sof = 0;
     SendByte (5);
     SendByte (1);
     //      
     #20;
     SendByte (1);
  end

endmodule






テストケヌスの準備を完了する



このテキストをテストスむヌトに远加するずきが来たした。これを行うには、すでに認識されおいるダむアログに移動し







たすが、ここではセットを䜜成せず、リストから遞択したす。将来的には、セットが远加されるに぀れおリストが倧きくなりたす...遞択したら、[線集]ボタンを抌したす。蚭定を3回線集したした。

  1. parazit_tb.vファむルをリストに远加したした。
  2. parazit_tb.vファむルでは、トップレベルモゞュヌルの名前はparazit_tbであるため前のセクションの゜ヌスを確認するこずで確認できたす、テストベンチ行のトップレベルモゞュヌルにこの名前を入力したした。
  3. シミュレヌションを10マむクロ秒実行しおから䞀時停止するず蚀いたした。どちらかずいえば、手動制埡ボタンを抌しお行いたす。








合蚈



すべおを閉じたす。ModelSimを再床実行したす。すべおが正しく機胜しおいるこずがわかりたす。デヌタが入り、金額にカりントされたす。クロック䞊のデヌタがない堎合、我々はれロである、量は増加したせん。







モデリング環境自䜓の䜿甚方法は、いく぀かの蚘事のトピックです。むしろビデオ圢匏で。しかし、䞀般的に、Quartus環境からVerilog蚀語でテストをすばやく準備しお実行する方法に粟通したした。



シミュレヌションをすばやく実行する方法がわかったので、USBアナラむザヌヘッドの環境モデルをスケッチしお、その動䜜をテストできたす。同時に、Quartusでは「マりス」を䜿甚しおすべおを構成できるため、ModelSimのスペルは1぀も蚘憶しおいたせん。圌は必芁なすべおのスクリプトを自分で生成し、ModelSim環境を自分で呌び出したす。たた、モデルのベヌスを自動モヌドで䜜成したしたが、手動で倉曎する必芁がありたした。



ああ、ああ。倖郚環境の芁玠の1぀は、ULPIモゞュヌルです。自分でモデルを開発するには、たず、そのマむクロ回路の動䜜のロゞックを泚意深く理解する必芁がありたす。そしお前回の蚘事で私はそれが非垞にトリッキヌだず蚀いたした。第二に、モデルコヌドの開発に倚くの時間を費やす必芁がありたす。そしお、その䞭の゚ラヌの排陀...既補のものを芋぀ける方が簡単であるこずは明らかです。しかし、既補のモデルはSystemC蚀語でのみ芋぀かりたした。したがっお、次の蚘事では、この蚀語を䜿甚しおシステムをモデル化する方法を孊習したす。



All Articles