`timescale 1ns / 1ps // ----------------------------------------------------------------------------- // cpu21_board_top 的仿真测试(不上板,纯 RTL 仿真) // // 检查内容: // 1) 复位释放后 CPU 能从片内 ROM 取指(ROM 由 cpu21_board_rom.vh 初始化); // 2) 程序通过 MMIO 写 LED,板载 LED 端口上能看到 16 位跑马灯序列。 // // 默认的 board_demo 程序带约 20 ms 软件延时,仿真只需确认第一次写入; // 若要完整验证跑马灯序列,可生成一份短延时的 ROM 并用 -d BOARD_ROM_FAST 编译: // xvlog -d BOARD_ROM_FAST board/cpu21_board_top.v testbench/tb_board_top.v // ----------------------------------------------------------------------------- module tb_board_top; reg clk100 = 1'b0; reg rst_n = 1'b0; reg go = 1'b0; reg [2:0] irq_sw = 3'b000; wire [15:0] led; wire led_we; always #5 clk100 = ~clk100; // 100 MHz cpu21_board_top #( .LED_ADDR(32'h0000_1000) ) dut ( .clk100(clk100), .rst_n (rst_n), .go (go), .irq_sw(irq_sw), .led (led), .led_we(led_we), // 扫雷扩展端口:本测试平台不复位测试这些功能,输入显式接 0/1, // 避免悬空(z)传到中断控制器里影响跑马灯的比对结果。 .btnu (1'b0), .btnd (1'b0), .btnl (1'b0), .btnr (1'b0), .sw_flag (1'b0), .ps2_clk (1'b1), .ps2_data(1'b1), .an (), .seg (), .dp (), .vga_r (), .vga_g (), .vga_b (), .vga_hs (), .vga_vs () ); integer changes = 0; reg [15:0] led_prev = 16'hxxxx; always @(posedge clk100) begin if (led !== led_prev) begin changes = changes + 1; led_prev = led; $display("t=%t LED=%04h led_we=%b", $time, led, led_we); end end initial begin $timeformat(-9, 3, " ns", 12); // %t 按 ns 显示(默认按精度 ps 显示) $display("NOTE: 复位后观察 LED(默认程序首次写入应为 0001)"); repeat (10) @(posedge clk100); rst_n = 1'b1; repeat (30000) @(posedge clk100); // 300 us(CPU 时钟为 clk100/2 = 50 MHz) $display("FINAL: LED 变化次数=%0d 当前 LED=%04h", changes, led); $finish; end endmodule