Curve Curve

HDL コ・シミュレーション vs. サイクルベース検証 vs. トランザクションベース検証

HDL コ・シミュレーション

HDL コ・シミュレーション (シミュレーション・アクセラレーションとも呼ばれる)では、テストベンチは未だにHDL(VerilogかVHDL)です。ZeBuでは、信号イベントごとにテストベンチとDUTとで同期を行ないます。

C++ コ・シミュレーション

C++ コ・シミュレーションでは、テストベンチはC++で記述します。信号はクロックの境界で同期化されます。クロックはC++テストベンチ制御のもとで進みます。

トランザクション・レベル・コ・エミュレーション

トランザクション・レベル・コ・エミュレーションでは、テストベンチはC++か、SystemCかSystemVerilogで記述します。テストベンチとDUTの間ではデータパケットが交換されます。DUTでパケットを信号にエンコードしたりデコードしたりするのはハードウェアの役割で、非常に高速です(DUTより速く、典型値で50 MHz)。この例では、パケットは有効画素に対応します。

標準的な結果:50 kHz(RTLシミュレーションの100倍)

Verilogコードサンプル

標準的な結果:スピードは200 kHzのレベルに

C++コードサンプル

標準的な結果:数10MHzのレベルに

C++コードサンプル

always @(posedge clk) begin
   if (!ce && !we) begin
      mem[add] <= data;
      $displayPixel(add, data);
   end
end
Signal &ce = *(top->ce);
Signal &we = *(top->we);
Signal &add = *(top->add);
Signal &data = *(top->data);

while(1) {
   if(!ce && !we){
      mem[add] = data;
         displayPixel(add, data);
   }
   top->run(1);
}
Port *rcv_port;
unsigned int *msg;


while(1) {

   while(!rcvPort->isPossibleToReceive());
   msg = rcvPort->receiveMessage();
   *add = msg[1] & 0x1fff;
   *data = msg[0];
   displayPixel(add, data);
}

このサンプルデザインはグラフィック・レンダリングエンジンで、Mandelbrotと呼ばれるフラクタルを計算するものです。テストベンチの選択による影響を明らかにするために、いろいろな処理方式で同じデザインを使用しました。

このデザインはビデオバス(信号CE、WE、ADD、DATA)に画素を書き込むことで出力しています。このバスのデコード方法によって(HDLシミュレータか、C++か、トランザクタを介して直接ハードウェアで行なうか)、同じ画像でも生成速度が違うわけです。

Curve Curve