4 Benchmark Test
This test was using RTL simulation bench. When C program calls print("$time"),
test bench in verilog prints $time.So call at start and finish of dhrystone
benchmark program. By using this technique you can measure exact clock
time for execution of benchmark program.
print "C" program
void print(unsigned char* ptr)//Verilog Test Bench Use { #ifdef DOS printf("%s ",ptr); #else while (*ptr) { *(volatile unsigned char*)print_port=*(ptr++); } *(volatile unsigned char*)print_port=0x00;//Write Done #endif } |
---|
Test bench in Verilog HDL
//YACC Test Bench //Apr.5.2005 Tak.Sugawara `include "define.h" `timescale 1ns/1ps module yacc_test; reg clock=0; reg Reset=0; reg int_req_usr=0; reg RXD=1'b1; wire TXD; wire [31:0] mem_data_w; wire mem_write; wire [15:0] mem_address; always #20 clock=~clock; initial begin Reset=0; #800 Reset=1; end `ifdef RTL_SIMULATION yacc cpu(.clock(clock),.Async_Reset(Reset),.MemoryWData(mem_data_w), .MWriteFF(mem_write), .data_port_address(mem_address),.RXD(RXD),.TXD(TXD)); `else yacc cpu(.clock(clock),.Async_Reset(Reset), .RXD(RXD),.TXD(TXD)); `endif 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:640*2-1] char_buffer; integer counter=0; always @ (posedge clock ) begin if ((mem_write === 1'b1)) begin if (mem_address==`Print_Port_Address) begin if (mem_data_w[7:0]===8'h00) begin char_buffer[counter*8 +:8]=mem_data_w[7:0]; 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*2; counter=counter+1) begin char_buffer[counter*8 +:8]=8'h00; end counter=0; end else begin char_buffer[counter*8 +:8]=mem_data_w[7:0]; counter=counter+1; end end else if (mem_address==`Print_CAHR_Port_Address) begin $write("%h ",mem_data_w[7:0]); end else if (mem_address==`Print_INT_Port_Address) begin $write("%h ",mem_data_w[15:0]);//Little Endian end else if (mem_address==`Print_LONG_Port_Address) begin $write("%h ",mem_data_w[31:0]);//Big Endian end end //if end //always //uart read port wire [7:0] buffer_reg; wire int_req; reg sync_reset; localparam LF=8'h0a; always @(posedge clock, negedge Reset) begin if (!Reset) sync_reset <=1'b1; else sync_reset<=1'b0; end uart_read uart_read_port( .sync_reset(sync_reset), .clk(clock), .rxd(TXD),.buffer_reg(buffer_reg), .int_req(int_req)); always @(posedge int_req) begin begin :local reg [7:0] local_mem [0:1000]; integer i=0; if (i>=1000) $stop;//assert(0); if (buffer_reg==LF) begin :local2 //pop stack integer j; j=0; while( j < i) begin $write( "%c",local_mem[j]); j=j+1; end $write(" : time=%t\n",$time); i=0;//clear stack end else begin//push stack local_mem[i]=buffer_reg; i=i+1; end end end endmodule |
---|
Figure below shows Spartan3 and Stratix2 result.
Test Start :330310ns
Test Stop: 498050ns
Since 10 cycles was done,
1 Cycle Time=(498510-330310)/10=168200ns
This means
59453Dhrystones/Sec
VAX Computer is 1757Dhrysones/Sec,this results 34DMIPS
In this test bench System Clock is set at 50MHz,
Therefore Final Result is as follows.
17DMIPS for Spartan3 (allowable synthesized maximum frequency is 25MHz)
110DMIPS for Stratix2(allowable synthesized maximum frequency is 165MHz)
Note:
In Dhrystone benchmark, assembled "strcmp" was used instead of "C strcmp ".This is important for fast DMIPS.