`timescale 1ns / 1ps

module lab1_top_tb;
    logic [4:0] sw;   // switch：低4位为BCD输入，第4位选择显示链路
    logic [9:0] led;  // light-emitting diode：LED输出，高电平点亮
    logic [6:0] cn;   // cathode，低电平有效：a-g段的控制输出
    logic [7:0] an;   // anode：位选控制，低电平选中
    logic       dp;   // decimal point：小数点控制，低电平点亮

    lab1_top dut(
        .sw(sw),
        .led(led),
        .cn(cn),
        .an(an),
        .dp(dp)
    );

    initial begin
        // 1. 逐次赋值，观察BCD输入和显示选择改变时的输出。
        // sw[4]选择显示链路，sw[3:0]提供BCD码。
        sw = 5'b0_0000;       // 选择LED，输入0，期望led[0]点亮。
        #10;                 // timescale为1ns / 1ps，#10表示等待10ns。

        sw[3:0] = 4'd3;      // BCD输入改为3，期望led[3]点亮。
        #10;

        sw[4] = 1'b1;        // 保持输入3，切换到数码管，期望显示3、LED熄灭。
        #10;

        sw[3:0] = 4'd9;      // BCD输入改为9，期望数码管显示9。
        #10;

        // 2. 选择LED，用循环遍历输入0-15。
        sw = 5'b0_0000;
        repeat(16) begin     // 将begin...end内的语句重复执行16次。
            // 保持当前输入10ns，再将BCD输入加1，便于逐段观察波形。
            #10 sw[3:0] = sw[3:0] + 4'd1;
        end
        // sw[3:0]只有4位，15加1后回到0。

        // 3. 选择数码管，再遍历输入0-15。
        sw = 5'b1_0000;
        repeat(16) begin
            #10 sw[3:0] = sw[3:0] + 4'd1;
        end

        // 请结合波形检查0-9的显示结果、输入10-15时的关闭行为，
        // 以及未选显示链路、位选an和小数点dp的输出，并自行补充测试用例。
        #10;
        $finish;
    end
endmodule
