Solving Approach

How do you plan to solve it?

A full LED bar is represented by 8'hFF, which has all eight LEDs ON.
To light only the amount indicated by level, we shift this full mask to the right by (8 – level).
Each right shift turns OFF one LED from the bottom of the bar.
This produces a clean, scalable way to generate a battery-style LED bar without long case statements or invalid replication syntax.

 

Code

/*Write your code here*/
module battery_led_bar(
    input [3:0] level,
    output [7:0] led_bar
);
    assign led_bar = (8'hFF >> (8 - level));
endmodule

 

Upvote
Downvote

Testbench Code

`timescale 1ns/1ps

module tb_battery_led_bar;
    // Input
    reg  [3:0] level;

    // DUT output
    wire [7:0] led_bar;

    // Expected output
    reg  [7:0] expected_led_bar;

    // Mismatch signal
    wire mismatch = (led_bar !== expected_led_bar);

    integer TOTAL_TEST_CASES = 0;
    integer TOTAL_PASSED_TEST_CASES = 0;
    integer TOTAL_FAILED_TEST_CASES = 0;

    // Instantiate DUT
    battery_led_bar dut (
        .level(level),
        .led_bar(led_bar)
    );

    // VCD dump
    initial begin
        $dumpfile("tb_battery_led_bar.vcd");
        $dumpvars(0,
            tb_battery_led_bar.level,            // input
            tb_battery_led_bar.led_bar,          // output
            tb_battery_led_bar.expected_led_bar, // expected
            tb_battery_led_bar.mismatch          // mismatch flag
        );
    end

    // Golden model
    task compute_expected;
        input [3:0] t_level;
        begin
            expected_led_bar = ~(8'hFF << t_level);
        end
    endtask

    task run_test;
        input [3:0] t_level;
        begin
            level = t_level;
            compute_expected(t_level);
            #1;

            TOTAL_TEST_CASES++;
            if (!mismatch) begin
                TOTAL_PASSED_TEST_CASES++;
            end else begin
                TOTAL_FAILED_TEST_CASES++;
                $display("FAILED: level=%0d | led_bar=%b expected=%b mismatch=%b",
                         level, led_bar, expected_led_bar, mismatch);
            end
        end
    endtask

    integer i;
    initial begin
        // Exhaustive tests for all valid levels 0–8
        for (i = 0; i <= 8; i = i + 1) begin
            run_test(i[3:0]);
        end

        // Print truth table
        $display("======================================");
        $display("level | led_bar   | expected | mismatch");
        $display("--------------------------------------");
        for (i = 0; i <= 8; i = i + 1) begin
            level = i;
            compute_expected(i);
            #1;
            $display("%2d    | %b | %b | %b",
                     level, led_bar, expected_led_bar, mismatch);
        end
        $display("======================================");

        // Summary
        $display("TOTAL_TEST_CASES=%0d", TOTAL_TEST_CASES);
        $display("TOTAL_PASSED_TEST_CASES=%0d", TOTAL_PASSED_TEST_CASES);
        $display("TOTAL_FAILED_TEST_CASES=%0d", TOTAL_FAILED_TEST_CASES);
        $display("ALL_TEST_CASES_PASSED=%s",
                 (TOTAL_FAILED_TEST_CASES==0) ? "true" : "false");
        $finish;
    end
endmodule