Welcome to Our Company
Home
Tutorial
Download
Opencores
F.A.Q.
Support
Purchase
Links

ベンチマークテスト

ベンチマークプログラム
同じソースでないと比較にならないので、Cプログラムを用意しました。5インターリーブの3重訂正が可能で最大15バイトのバーストエラー訂正ができます。通常ハードウェアでやる処理をファームで行いベンチマークとします。故意にエラーを作って正しく訂正されれば、プログラムとハードウェアがそれなりに動いていると言っていいでしょう。
時間計測は、Verilogのシミュレーション上の時間($time)を使います。(テストベンチトップで、CLOCK周期は同じ50MHzにします。)
これを、スタートアップを除いた正味の時間を計測するために訂正プログラムの最初と最後に呼び出します。


Cソースで次のCallでVerilogの$timeを実行するようにします。
print("$time");//For Bench Mark

printの中身はRAMのポートを叩くだけです。
//Verilog Specific Routines
void print(unsigned char* ptr)//Verilog Test Bench Use
{
 while (*ptr) {
  print_port=*(ptr++);
 }
 print_port=0x00;//Write Done
}


Verilog側では、print_portのアドレスをCコンパイラが吐くMAPFileからもらってDefineで定義します。
以降このソースをデバッガと呼ぶことにします。
      `define Print_Port_Address 16'he7c9  //SH2
      `define Print_CAHR_Port_Address 16'hdfe8
      `define Print_INT_Port_Address 16'he7cc  //First ADDRESS
      `define Print_LONG_Port_Address 16'hdfec  //First ADDRESS

        task Cprint;// String OUT until the byte 00 or xx detected with least Byte first and justified.
                integer i;
                begin :Block
                        i=0;
                        while (1) begin
                                if (char_buffer[i*8 +:8] ===8'h00 || char_buffer[i*8 +:8]===8'hxx) begin
                                                disable Block;
                                end     
                                $write("%c",char_buffer[i*8 +:8]);
                                i=i+1;  
                        end
                end
        endtask

   reg [0:639] char_buffer;
   integer  counter=0; 
   reg flag=0;   //Jan.31.2004 To address multi-cycle write for BYTE and WORD 
   
   always @ (posedge CLK ) begin
            if ((WE === 1'b1) && !flag) begin//Jan.31.2004       
                   if (ADR[15:0]==`Print_Port_Address) begin
                                flag=1;
                                if (DATI[15: 8]===8'h00) begin
                                        char_buffer[counter*8 +:8]=DATI[15: 8];
                                        if (char_buffer[0  +:8*7]==="$finish") begin
                                                        $stop;                          
                                                        
                                        end else if (char_buffer[0  +:8*5]==="$time") begin
                                                        $display("Current Time on Simulation=%d",$time);                                
                                                        
                                        end else  Cprint;//$write("%s",char_buffer);

                                        for (counter=0; counter< 80; counter=counter+1) begin
                                                char_buffer[counter*8 +:8]=8'h00;
                                        end
                                        counter=0;
                                
                                end else begin
                                        char_buffer[counter*8 +:8]=DATI[15: 8];
                                        counter=counter+1;
                                end
                   end
           else if (ADR[15:0]==`Print_CAHR_Port_Address ) begin
                                flag=1;
                                $write("%h ",DATI[7: 0]);
                   end else if (ADR[15:0]==`Print_INT_Port_Address) begin
                                flag=1;
                                #10 $write("%h ",DATI[15:0]);//Little Endian 
                   end else if (ADR[15:0]==`Print_LONG_Port_Address) begin
                                #10 $write("%h ",DATI[31:0]);//Big Endian
                   end 
        end //if
        else if (!WE) flag=0;//Jan.31.2004
   end //always