/*
|
/*
|
* Simply RISC M1 Core Testbench
|
* M1 Core Testbench
|
*/
|
*/
|
|
|
`include "ddr_include.v"
|
`include "ddr_include.v"
|
|
|
module testbench();
|
module testbench();
|
|
|
/*
|
/*
|
* Registers
|
* Registers
|
*/
|
*/
|
|
|
// System
|
// System
|
reg sys_clock;
|
reg sys_clock;
|
reg sys_reset;
|
reg sys_reset;
|
|
|
/*
|
/*
|
* Wires
|
* Wires
|
*/
|
*/
|
|
|
// VGA Port
|
// VGA Port
|
wire vga_rgb_r;
|
wire vga_rgb_r;
|
wire vga_rgb_g;
|
wire vga_rgb_g;
|
wire vga_rgb_b;
|
wire vga_rgb_b;
|
wire vga_hsync;
|
wire vga_hsync;
|
wire vga_vsync;
|
wire vga_vsync;
|
|
|
// PS/2 Keyboard interface
|
// PS/2 Keyboard interface
|
wire ps2_keyboard_clock;
|
wire ps2_keyboard_clock;
|
wire ps2_keyboard_data;
|
wire ps2_keyboard_data;
|
wire[7:0] received_char;
|
wire[7:0] received_char;
|
wire char_valid;
|
wire char_valid;
|
|
|
// DDR Port
|
// DDR Port
|
wire ddr_clk;
|
wire ddr_clk;
|
wire ddr_clk_n;
|
wire ddr_clk_n;
|
wire ddr_clk_fb = ddr_clk;
|
wire ddr_clk_fb = ddr_clk;
|
wire ddr_ras_n;
|
wire ddr_ras_n;
|
wire ddr_cas_n;
|
wire ddr_cas_n;
|
wire ddr_we_n;
|
wire ddr_we_n;
|
wire ddr_cke;
|
wire ddr_cke;
|
wire ddr_cs_n;
|
wire ddr_cs_n;
|
wire[`A_RNG] ddr_a;
|
wire[`A_RNG] ddr_a;
|
wire[`BA_RNG] ddr_ba;
|
wire[`BA_RNG] ddr_ba;
|
wire[`DQ_RNG] ddr_dq;
|
wire[`DQ_RNG] ddr_dq;
|
wire[`DQS_RNG] ddr_dqs;
|
wire[`DQS_RNG] ddr_dqs;
|
wire[`DM_RNG] ddr_dm;
|
wire[`DM_RNG] ddr_dm;
|
|
|
/*
|
/*
|
* Module instances
|
* Module instances
|
*/
|
*/
|
|
|
// DUT (Design Under Test)
|
// DUT (Design Under Test)
|
spartan3esk_top spartan3esk_top_0 (
|
spartan3esk_top spartan3esk_top_0 (
|
|
|
// System
|
// System
|
.sys_clock_i(sys_clock),
|
.sys_clock_i(sys_clock),
|
.sys_reset_i(sys_reset),
|
.sys_reset_i(sys_reset),
|
|
|
// VGA Port
|
// VGA Port
|
.vga_rgb_r_o(vga_rgb_r),
|
.vga_rgb_r_o(vga_rgb_r),
|
.vga_rgb_g_o(vga_rgb_g),
|
.vga_rgb_g_o(vga_rgb_g),
|
.vga_rgb_b_o(vga_rgb_b),
|
.vga_rgb_b_o(vga_rgb_b),
|
.vga_hsync_o(vga_hsync),
|
.vga_hsync_o(vga_hsync),
|
.vga_vsync_o(vga_vsync),
|
.vga_vsync_o(vga_vsync),
|
|
|
// PS/2 Keyboard interface
|
// PS/2 Keyboard interface
|
.ps2_keyboard_clock_io(ps2_keyboard_clock),
|
.ps2_keyboard_clock_io(ps2_keyboard_clock),
|
.ps2_keyboard_data_io(ps2_keyboard_data),
|
.ps2_keyboard_data_io(ps2_keyboard_data),
|
|
|
// DDR Port
|
// DDR Port
|
.ddr_clk(ddr_clk),
|
.ddr_clk(ddr_clk),
|
.ddr_clk_n(ddr_clk_n),
|
.ddr_clk_n(ddr_clk_n),
|
.ddr_clk_fb(ddr_clk_fb),
|
.ddr_clk_fb(ddr_clk_fb),
|
.ddr_ras_n(ddr_ras_n),
|
.ddr_ras_n(ddr_ras_n),
|
.ddr_cas_n(ddr_cas_n),
|
.ddr_cas_n(ddr_cas_n),
|
.ddr_we_n(ddr_we_n),
|
.ddr_we_n(ddr_we_n),
|
.ddr_cke(ddr_cke),
|
.ddr_cke(ddr_cke),
|
.ddr_cs_n(ddr_cs_n),
|
.ddr_cs_n(ddr_cs_n),
|
.ddr_a(ddr_a),
|
.ddr_a(ddr_a),
|
.ddr_ba(ddr_ba),
|
.ddr_ba(ddr_ba),
|
.ddr_dq(ddr_dq),
|
.ddr_dq(ddr_dq),
|
.ddr_dqs(ddr_dqs),
|
.ddr_dqs(ddr_dqs),
|
.ddr_dm(ddr_dm)
|
.ddr_dm(ddr_dm)
|
|
|
);
|
);
|
|
|
// PS/2 Keyboard model
|
// PS/2 Keyboard model
|
ps2_keyboard_model ps2_keyboard_model_0 (
|
ps2_keyboard_model ps2_keyboard_model_0 (
|
.kbd_clk_io(ps2_keyboard_clock),
|
.kbd_clk_io(ps2_keyboard_clock),
|
.kbd_data_io(ps2_keyboard_data),
|
.kbd_data_io(ps2_keyboard_data),
|
.last_char_received_o(received_char),
|
.last_char_received_o(received_char),
|
.char_valid_o(char_valid)
|
.char_valid_o(char_valid)
|
);
|
);
|
|
|
// DDR model (Micron mt46v16m16)
|
// DDR model (Micron mt46v16m16)
|
ddr ddr_0 (
|
ddr ddr_0 (
|
.Dq(ddr_dq),
|
.Dq(ddr_dq),
|
.Dqs(ddr_dqs),
|
.Dqs(ddr_dqs),
|
.Addr(ddr_a),
|
.Addr(ddr_a),
|
.Ba(ddr_ba),
|
.Ba(ddr_ba),
|
.Clk(ddr_clk),
|
.Clk(ddr_clk),
|
.Clk_n(ddr_clk_n),
|
.Clk_n(ddr_clk_n),
|
.Cke(ddr_cke),
|
.Cke(ddr_cke),
|
.Cs_n(ddr_cs_n),
|
.Cs_n(ddr_cs_n),
|
.Ras_n(ddr_ras_n),
|
.Ras_n(ddr_ras_n),
|
.Cas_n(ddr_cas_n),
|
.Cas_n(ddr_cas_n),
|
.We_n(ddr_we_n),
|
.We_n(ddr_we_n),
|
.Dm(ddr_dm)
|
.Dm(ddr_dm)
|
);
|
);
|
|
|
/*
|
/*
|
* Sequential logic
|
* Sequential logic
|
*/
|
*/
|
|
|
// Clock
|
// Clock
|
always #10 sys_clock = !sys_clock;
|
always #10 sys_clock = !sys_clock;
|
|
|
// Reset
|
// Reset
|
initial begin
|
initial begin
|
|
|
// Display start message
|
// Display start message
|
$display("INFO: TBENCH(%m): Starting Simply RISC M1 Core simulation...");
|
$display("INFO: TBENCH(%m): Starting M1 Core simulation...");
|
|
|
// Create VCD trace file
|
// Create VCD trace file
|
$dumpfile("trace.vcd");
|
$dumpfile("trace.vcd");
|
$dumpvars();
|
$dumpvars();
|
|
|
// Run the simulation
|
// Run the simulation
|
sys_clock <= 1;
|
sys_clock <= 1;
|
sys_reset <= 1;
|
sys_reset <= 1;
|
#1000
|
#1000
|
sys_reset <= 0;
|
sys_reset <= 0;
|
#99000
|
#99000
|
$display("INFO: TBENCH(%m): Completed Simply RISC M1 Core simulation!");
|
$display("INFO: TBENCH(%m): Completed M1 Core simulation!");
|
$finish;
|
$finish;
|
|
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|
|
|