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.