| |
| module testbench; |
| |
| parameter pmem_width = 11; |
| parameter dmem_width = 13; |
| |
| // navre inputs |
| reg clk; |
| reg rst; |
| reg [15:0] pmem_d; |
| reg [7:0] dmem_di; |
| reg [7:0] io_di; |
| reg [7:0] irq; |
| |
| // navre outputs |
| wire pmem_ce; |
| wire [pmem_width-1:0] pmem_a; |
| wire dmem_we; |
| wire [dmem_width-1:0] dmem_a; |
| wire [7:0] dmem_do; |
| wire io_re; |
| wire io_we; |
| wire [5:0] io_a; |
| wire [7:0] io_do; |
| wire [7:0] irq_ack; |
| wire [pmem_width-1:0] dbg_pc; |
| |
| softusb_navre #( |
| pmem_width, |
| dmem_width |
| ) UUT ( |
| clk, |
| rst, |
| |
| pmem_ce, |
| pmem_a, |
| pmem_d, |
| |
| dmem_we, |
| dmem_a, |
| dmem_di, |
| dmem_do, |
| |
| io_re, |
| io_we, |
| io_a, |
| io_do, |
| io_di, |
| |
| irq, |
| irq_ack, |
| dbg_pc |
| ); |
| |
| integer cycles; |
| initial begin |
| clk <= 1; |
| rst <= 1; |
| cycles = 0; |
| while (cycles < 8) begin |
| #50; clk <= ~clk; |
| cycles = cycles + 1; |
| #50; clk <= ~clk; |
| end |
| rst <= #20 0; |
| forever begin |
| #50; clk <= ~clk; |
| cycles = cycles + 1; |
| #50; clk <= ~clk; |
| if (cycles == 10000) begin |
| $display("Reached limit of 10000 cpu cycles."); |
| $finish; |
| end |
| end |
| end |
| |
| reg [15:0] addr; |
| reg [15:0] pmem [2**pmem_width-1:0]; |
| reg [ 7:0] dmem [2**dmem_width-1:0]; |
| |
| integer output_idx; |
| reg [7:0] output_buf [1023:0]; |
| event output_eof; |
| |
| integer i; |
| initial begin |
| for (i=0; i < 2**pmem_width; i = i+1) begin |
| pmem[i] = 0; |
| end |
| for (i=0; i < 2**dmem_width; i = i+1) begin |
| dmem[i] = 0; |
| end |
| `include "sieve.vh" |
| output_idx = 0; |
| end |
| |
| always @(posedge clk) begin |
| if (rst) begin |
| pmem_d <= 0; |
| irq <= 0; |
| end else if (pmem_ce) begin |
| addr = pmem_a * 2; |
| $display("+LOG+ %t PR @%x %x", $time, addr, pmem[pmem_a]); |
| pmem_d <= pmem[pmem_a]; |
| end |
| if (dmem_we) begin |
| addr = dmem_a; |
| $display("+LOG+ %t DW @%x %x", $time, addr, dmem_do); |
| dmem[dmem_a] <= dmem_do; |
| end |
| if (io_we && io_a == 42) begin |
| addr = io_a; |
| $display("+LOG+ %t IO @%x %x <---", $time, addr, io_do); |
| if (io_do == 0) begin |
| -> output_eof; |
| end else begin |
| output_buf[output_idx] = io_do; |
| output_idx = output_idx + 1; |
| end |
| end |
| dmem_di <= dmem[dmem_a]; |
| io_di <= 0; |
| end |
| |
| always @(output_eof) begin |
| #1001; |
| $display("Got EOF marker on IO port."); |
| for (i = 0; i < output_idx; i = i + 1) begin |
| $display("+OUT+ %t %d", $time, output_buf[i]); |
| end |
| $finish; |
| end |
| |
| initial begin |
| // $dumpfile("bench.vcd"); |
| // $dumpvars(0, testbench); |
| end |
| |
| endmodule |