ModelSim模拟结果与我的多路复用器代码的逻辑不匹配

时间:2019-05-31 22:11:09

标签: verilog modelsim

我用“ always”和“ case”语句编写了一些关于7对1多路复用器的verilog代码,但是当我在ModelSim中进行仿真时,结果似乎无法按预期工作

多路复用器逻辑的一部分:

when SW[9:7] = 000, OUT = SW[0]

矛盾:

In the simulation when SW[0] is changed to 1, the outcome stays at 0.
module SevenToOneMUX(SW, OUT);

    input [9:0] SW;
    output reg OUT;

    always@(SW[9:7])
    begin
        case (SW[9:7])
            3'b000: OUT = SW[0];
            3'b001: OUT = SW[1];
            3'b010: OUT = SW[2];
            3'b011: OUT = SW[3];
            3'b100: OUT = SW[4];
            3'b101: OUT = SW[5];
            3'b110: OUT = SW[6];
        endcase
    end

endmodule

1 个答案:

答案 0 :(得分:1)

问题在于,您只将SW的3个最高有效位放在了组合块的敏感度列表中。这意味着如果always@(SW[9:7])发生更改,编译器将仅执行SW[9:7]块。

如果您希望模拟器在OUT的任何一位更改时更新SW,请将您的敏感度列表更改为以下内容:

always@(*)
begin
    /*...*/
end

还应注意,在创建可合成的组合逻辑时,通常使用Verilog-2001中添加的always@(*)。在硬件中,实际逻辑将对每个右侧变量“敏感”。这意味着:如果您描述的逻辑的任何输入发生更改,则输出也会更改。