case 语句和赋值在 system-verilog/verilog 中如何工作?

How does case statement and assignment of values work in system-verilog/verilog?

我有一个设计模块(部分实现的七段显示器),其中包含如下所示的案例陈述。但是,看起来,如果 case 语句不满足 bcd 值,则先前分配的段值将作为 bcd 值的段值返回,这在 switch 语句中不适用。

为什么会这样?假设我不想使用默认语句。

我打印出了 bcd、segment 和 expectedOutput 的值,并观察了我刚刚在上面写的内容。

module seven_segment_display(output logic[6:0] segment, input logic[3:0] bcd);
    always@(*)
        begin
            case (bcd)
                4'b0011 : begin segment = 7'b1011011; end
                4'b1000 : begin segment = 7'b1111011; end
                4'b1010 : begin segment = 7'b0000000; end
                4'b0000 : begin segment = 7'b1111110; end
            endcase
        end
endmodule
bcd  segment expectedOutput
0000 1111110 1111110
0001 1111110 0110000
0010 1111110 1101101
0011 1011011 1111001
0100 1011011 0110011
0101 1011011 1011011
0110 1011011 1011111
0111 1011011 1110000
1000 1111011 1111111
1001 1111011 1111011
1010 0000000 0000000
1011 0000000 0000000
1100 0000000 0000000
1101 0000000 0000000
1110 0000000 0000000
1111 0000000 0000000

segment 是一个变量。与任何其他(软件)语言一样,变量会记住它们的值,直到您用其他值覆盖它们的值。

您的第一个输入 (bcd) 是 4'b0000。有一个 case 语句的分支匹配该值,因此 7'b1111110 的值被分配给变量 segment。然后将 bcd 的值更改为 4'b0001。没有与该值匹配的分支,因此没有新值分配给变量 segment。因此,它保留了它的旧值。