使用 if/else 和 case 语句时出现错误号 10170

0 verilog

我正在尝试编译以下代码,但每当我这样做时,我都会收到错误:

'10170 FSM.v(9) 文本“case”附近的 Verilog HDL 语法错误;期待一个操作数'

'10170 FSM.v(9) 文本“)”附近的 Verilog HDL 语法错误;预期“<=”或“=”

'10170 FSM.v(11) 文本“4”附近的 Verilog HDL 语法错误;期待“结束”

module FSM (in0, in1, in2, in3, S, out0, out1, out2, out3); 
input in0, in1, in2, in3, S;
output out0, out1, out2, out3;
reg out0, out1, out2, out3;
always @(in0 or in1 or in2 or in3 or S)
begin
    if(S == 0) begin
    {
        case({in3, in2, in1, in0})
            4'b0000: {out3, out2, out1, out0} = 4'b0000; //0->0
            4'b0001: {out3, out2, out1, out0} = 4'b0011; //1->3
            4'b0010: {out3, out2, out1, out0} = 4'b0110; //2->6
            4'b0011: {out3, out2, out1, out0} = 4'b1001; //3->9
            4'b0100: {out3, out2, out1, out0} = 4'b0010; //4->2
            4'b0101: {out3, out2, out1, out0} = 4'b0101; //5->5
            4'b0110: {out3, out2, out1, out0} = 4'b1000; //6->8
            4'b0111: {out3, out2, out1, out0} = 4'b0001; //7->1
            4'b1000: {out3, out2, out1, out0} = 4'b0100; //8->4
            4'b1001: {out3, out2, out1, out0} = 4'b0111; //9->7
        endcase
    }
    end
    else begin
    {
        case({in3, in2, in1, in0})
            4'b0000: {out3, out2, out1, out0} = 4'b0111; //0->7
            4'b0001: {out3, out2, out1, out0} = 4'b1000; //1->8
            4'b0010: {out3, out2, out1, out0} = 4'b1001; //2->9
            4'b0011: {out3, out2, out1, out0} = 4'b0000; //3->0
            4'b0100: {out3, out2, out1, out0} = 4'b0001; //4->1
            4'b0101: {out3, out2, out1, out0} = 4'b0010; //5->2
            4'b0110: {out3, out2, out1, out0} = 4'b0011; //6->3
            4'b0111: {out3, out2, out1, out0} = 4'b0100; //7->4
            4'b1000: {out3, out2, out1, out0} = 4'b0101; //8->5
            4'b1001: {out3, out2, out1, out0} = 4'b0110; //9->6
        endcase
    }
    end
end
endmodule
Run Code Online (Sandbox Code Playgroud)

对于语句中找到的每一行代码,都会重复最后一个错误case。如果有人知道我出了什么问题以及如何解决这个问题,我将不胜感激。

sha*_*111 5

删除条件后的大括号( {..}) if。Verilog 不是需要大括号的 C,在 Verilog 中,我们用于begin..end多行程序语句。

另外,建议使用always @(*)(或在 SystemVerilog 中)进行自动灵敏度,而不是手动灵敏度。always_combalways @(in0 or in1 or in2 or in3 or S)

您可能必须了解详细的 Verilog 语法。有关某些信息,请参阅Begin..end链接和始终敏感度问题。Verilog请参阅IEEE 1364-2001 ,SystemVerilog 请参阅IEEE 1800-2012