2022-07-27 15:07:16 +08:00
|
|
|
`timescale 1ns / 1ps
|
|
|
|
|
|
|
|
`define CONFREG_NUM_REG soc_lite.u_confreg.num_data
|
|
|
|
`define CONFREG_NUM_MONITOR soc_lite.u_confreg.num_monitor
|
|
|
|
|
|
|
|
`define CONFREG_UART_DISPLAY soc_lite.u_confreg.write_uart_valid
|
|
|
|
`define CONFREG_UART_DATA soc_lite.u_confreg.write_uart_data
|
|
|
|
|
|
|
|
`define END_PC 32'hbfc00100
|
|
|
|
|
|
|
|
module testbench_top (
|
|
|
|
input clk,
|
|
|
|
input resetn,
|
2022-08-01 22:01:24 +08:00
|
|
|
input [ 7:0] switch_sim,
|
2022-07-27 15:07:16 +08:00
|
|
|
output [15:0] led,
|
|
|
|
output [ 1:0] led_rg0,
|
|
|
|
output [ 1:0] led_rg1,
|
|
|
|
output [ 7:0] num_csn,
|
|
|
|
output [ 6:0] num_a_g
|
|
|
|
);
|
2022-07-29 17:44:11 +08:00
|
|
|
initial begin
|
2022-08-01 22:01:24 +08:00
|
|
|
$display("[%0t] Tracing to logs/trace.fst...", $time);
|
|
|
|
$dumpfile("logs/trace.fst");
|
2022-07-29 17:44:11 +08:00
|
|
|
$dumpvars();
|
|
|
|
$display("[%0t] Model running...", $time);
|
|
|
|
end
|
|
|
|
|
2022-07-27 15:07:16 +08:00
|
|
|
//gpio
|
|
|
|
logic [ 3:0] btn_key_col;
|
|
|
|
logic [ 3:0] btn_key_row;
|
|
|
|
logic [ 1:0] btn_step;
|
|
|
|
|
|
|
|
logic uart_display;
|
|
|
|
logic [ 7:0] uart_data;
|
|
|
|
logic [31:0] confreg_num_reg;
|
|
|
|
logic [31:0] confreg_num_reg_r;
|
|
|
|
|
|
|
|
assign btn_key_row = 4'd0;
|
|
|
|
assign btn_step = 2'd3;
|
|
|
|
assign uart_display = `CONFREG_UART_DISPLAY;
|
|
|
|
assign uart_data = `CONFREG_UART_DATA;
|
|
|
|
assign confreg_num_reg = `CONFREG_NUM_REG;
|
|
|
|
|
|
|
|
// soc clk & debug info
|
|
|
|
logic [31:0] debug_wb_pc;
|
|
|
|
logic [ 3:0] debug_wb_rf_wen;
|
|
|
|
logic [ 4:0] debug_wb_rf_wnum;
|
|
|
|
logic [31:0] debug_wb_rf_wdata;
|
|
|
|
logic [31:0] debug_wb1_pc;
|
|
|
|
logic [ 3:0] debug_wb1_rf_wen;
|
|
|
|
logic [ 4:0] debug_wb1_rf_wnum;
|
|
|
|
logic [31:0] debug_wb1_rf_wdata;
|
|
|
|
logic debug_wb_pc_A;
|
|
|
|
logic [ 3:0] dbg_0_rf_wen;
|
|
|
|
logic [31:0] dbg_0_pc;
|
|
|
|
logic [ 4:0] dbg_0_rf_wnum;
|
|
|
|
logic [31:0] dbg_0_rf_wdata;
|
|
|
|
logic [ 3:0] dbg_1_rf_wen;
|
|
|
|
logic [31:0] dbg_1_pc;
|
|
|
|
logic [ 4:0] dbg_1_rf_wnum;
|
|
|
|
logic [31:0] dbg_1_rf_wdata;
|
|
|
|
assign debug_wb_pc = soc_lite.debug_wb_pc;
|
|
|
|
assign debug_wb_rf_wen = soc_lite.debug_wb_rf_wen;
|
|
|
|
assign debug_wb_rf_wnum = soc_lite.debug_wb_rf_wnum;
|
|
|
|
assign debug_wb_rf_wdata = soc_lite.debug_wb_rf_wdata;
|
|
|
|
assign debug_wb1_pc = soc_lite.u_cpu.debug_wb1_pc;
|
|
|
|
assign debug_wb1_rf_wen = soc_lite.u_cpu.debug_wb1_rf_wen;
|
|
|
|
assign debug_wb1_rf_wnum = soc_lite.u_cpu.debug_wb1_rf_wnum;
|
|
|
|
assign debug_wb1_rf_wdata = soc_lite.u_cpu.debug_wb1_rf_wdata;
|
|
|
|
assign debug_wb_pc_A = soc_lite.u_cpu.debug_wb_pc_A;
|
|
|
|
|
2022-07-29 17:44:11 +08:00
|
|
|
always @(posedge clk) begin
|
2022-07-27 15:07:16 +08:00
|
|
|
if (debug_wb_pc_A) begin
|
|
|
|
dbg_0_rf_wen <= debug_wb1_rf_wen;
|
|
|
|
dbg_0_pc <= debug_wb1_pc;
|
|
|
|
dbg_0_rf_wnum <= debug_wb1_rf_wnum;
|
|
|
|
dbg_0_rf_wdata <= debug_wb1_rf_wdata;
|
|
|
|
|
|
|
|
dbg_1_rf_wen <= debug_wb_rf_wen;
|
|
|
|
dbg_1_pc <= debug_wb_pc;
|
|
|
|
dbg_1_rf_wnum <= debug_wb_rf_wnum;
|
|
|
|
dbg_1_rf_wdata <= debug_wb_rf_wdata;
|
|
|
|
end else begin
|
|
|
|
dbg_1_rf_wen <= debug_wb1_rf_wen;
|
|
|
|
dbg_1_pc <= debug_wb1_pc;
|
|
|
|
dbg_1_rf_wnum <= debug_wb1_rf_wnum;
|
|
|
|
dbg_1_rf_wdata <= debug_wb1_rf_wdata;
|
|
|
|
|
|
|
|
dbg_0_rf_wen <= debug_wb_rf_wen;
|
|
|
|
dbg_0_pc <= debug_wb_pc;
|
|
|
|
dbg_0_rf_wnum <= debug_wb_rf_wnum;
|
|
|
|
dbg_0_rf_wdata <= debug_wb_rf_wdata;
|
|
|
|
end
|
2022-07-29 17:44:11 +08:00
|
|
|
|
|
|
|
//if (|dbg_0_rf_wen & resetn) begin
|
|
|
|
// $display("path0 : PC = 0x%8h, wb_rf_wnum = 0x%2h, wb_rf_wdata = 0x%8h, wen= %d",
|
|
|
|
// dbg_0_pc, dbg_0_rf_wnum, dbg_0_rf_wdata, |dbg_0_rf_wen);
|
|
|
|
//end
|
|
|
|
//if (|dbg_1_rf_wen & resetn) begin
|
|
|
|
// $display("path1 : PC = 0x%8h, wb_rf_wnum = 0x%2h, wb_rf_wdata = 0x%8h, wen= %d",
|
|
|
|
// dbg_1_pc, dbg_1_rf_wnum, dbg_1_rf_wdata, |dbg_1_rf_wen);
|
|
|
|
//end
|
2022-07-27 15:07:16 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
// UART
|
2022-07-29 17:44:11 +08:00
|
|
|
always @(posedge clk) begin
|
2022-07-27 15:07:16 +08:00
|
|
|
if (uart_display) begin
|
|
|
|
if (uart_data == 8'hff) begin
|
|
|
|
; //$finish;
|
|
|
|
end else begin
|
|
|
|
$write("%c", uart_data);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
// Numeric Display
|
|
|
|
logic [7:0] err_count;
|
2022-07-29 17:44:11 +08:00
|
|
|
always_ff @(posedge clk) begin
|
2022-07-27 15:07:16 +08:00
|
|
|
confreg_num_reg_r <= confreg_num_reg;
|
|
|
|
if (!resetn) begin
|
|
|
|
err_count <= 8'd0;
|
|
|
|
end else if (confreg_num_reg_r != confreg_num_reg && `CONFREG_NUM_MONITOR) begin
|
|
|
|
if (confreg_num_reg[7:0] != confreg_num_reg_r[7:0] + 1'b1) begin
|
|
|
|
$display("--------------------------------------------------------------");
|
|
|
|
$display("[%t] Error(%d)! Occurred in number 8'd%02d Functional Test Point!", $time, err_count, confreg_num_reg[31:24]);
|
|
|
|
$display("--------------------------------------------------------------");
|
|
|
|
err_count <= err_count + 1'b1;
|
2022-07-29 17:44:11 +08:00
|
|
|
$finish;
|
2022-07-27 15:07:16 +08:00
|
|
|
end else if (confreg_num_reg[31:24] != confreg_num_reg_r[31:24] + 1'b1) begin
|
|
|
|
$display("--------------------------------------------------------------");
|
|
|
|
$display("[%t] Error(%d)! Unknown, Functional Test Point numbers are unequal!", $time, err_count);
|
|
|
|
$display("--------------------------------------------------------------");
|
|
|
|
err_count <= err_count + 1'b1;
|
2022-07-29 17:44:11 +08:00
|
|
|
$finish;
|
2022-07-27 15:07:16 +08:00
|
|
|
end else begin
|
|
|
|
$display("----[%t] Number 8'd%02d Functional Test Point PASS!", $time, confreg_num_reg[31:24]);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
//test end
|
|
|
|
logic test_end;
|
|
|
|
assign test_end = (dbg_0_pc == `END_PC) || (dbg_1_pc == `END_PC) || (uart_display && uart_data == 8'hff);
|
2022-07-29 17:44:11 +08:00
|
|
|
always @(posedge clk)
|
2022-07-27 15:07:16 +08:00
|
|
|
if (test_end) begin
|
|
|
|
if (err_count != 0) begin
|
|
|
|
$display("");
|
|
|
|
$display("==============================================================");
|
|
|
|
$display("Test end with ERROR!");
|
|
|
|
end else begin
|
|
|
|
$display("");
|
|
|
|
$display("==============================================================");
|
|
|
|
$display("Test end!");
|
|
|
|
end
|
|
|
|
$finish;
|
|
|
|
end
|
|
|
|
|
|
|
|
soc_axi_lite_top #(
|
|
|
|
.SIMULATION(1'b1)
|
|
|
|
) soc_lite (
|
|
|
|
.resetn(resetn),
|
|
|
|
.clk (clk),
|
|
|
|
|
|
|
|
//------gpio-------
|
|
|
|
.num_csn (num_csn),
|
|
|
|
.num_a_g (num_a_g),
|
|
|
|
.led (led),
|
|
|
|
.led_rg0 (led_rg0),
|
|
|
|
.led_rg1 (led_rg1),
|
2022-08-01 22:01:24 +08:00
|
|
|
.switch (switch_sim),
|
2022-07-27 15:07:16 +08:00
|
|
|
.btn_key_col(btn_key_col),
|
|
|
|
.btn_key_row(btn_key_row),
|
|
|
|
.btn_step (btn_step)
|
|
|
|
);
|
|
|
|
|
|
|
|
endmodule
|