错误(10170):jmd_alub_v.v(31)附近文本“else”的Verilog HDL语法错误;
多次怀疑这个错误可能会有人帮助我,我不知道问题出在哪里
module jmd_alub_v(A, B, FS, F, Cout);
input [3:0] FS;
input [3:0] A, B;
output reg [3:0] F;
output wire Cout;
wire [4:0] Sum, Incr, Diff, Decr, Shr ;
assign Sum = {1'b0, A} + {1'b0 ,B} + FS[0];
assign Diff ={1'b0, A} + {1'b0,~B} + FS[0];
assign Incr = {1'b0,A} + FS[0];
assign Decr = {1'b0,A} + 5'b01111;
assign Shr[4] = A[0];
assign Shr[3] = A[3];
assign Shr[2] = A[3];
assign Shr[1] = A[2];
assign Shr[0] = A[1];
always @(A,B,FS)
begin
if (FS == 4'b0000)
F = A;
else if (FS == 4'b0001)
F = Incr[3:0];
Cout = Incr[4];
else if (FS == 4'b0010)
F = Sum[3:0];
Cout = Sum[4];
else if (FS == 4'b0011)
F = Sum[3:0];
Cout = Sum[4];
else if (FS == 4'b0100)
F = Diff[3:0];
Cout = Diff[4];
else if (FS == 4'b0101)
F = Diff[3:0];
Cout = Diff[4];
else if (FS == 4'b0110)
F = Decr[3:0];
Cout = Decr[4];
else if (FS == 4'b0111)
F = A;
else if (FS == 4'b1000)
F = ~A;
else if (FS == 4'b1001)
F = ~A;
else if (FS == 4'b1010)
F = A & B;
else if (FS == 4'b1011)
F = A & B;
else if (FS == 4'b1100)
F = A | B;
else if (FS == 4'b1101)
F = A | B;
else if (FS == 4'b1110)
F = Shr[3:0];
Cout = Shr[4];
else if (FS == 4'b1111)
F = Shr[3:0];
Cout = Shr[4];
else
F = 4'b0000; //default
Cout = 1'b0; // default
end
endmodule
答案 0 :(得分:1)
如果您要在if
或else
中添加多个语句,则需要将其括在begin
和end
中,例如:
if (FS == 4'b0000)
F = A;
else if (FS == 4'b0001)
begin
F = Incr[3:0];
Cout = Incr[4];
end
答案 1 :(得分:1)
如果您在if / else中使用多个语句,则需要将其括在begin
和end
中。在学习Verilog时,我会建议大量使用它们,因为它可以避免常见错误并使重构更容易。
例如:
if (FS == 4'b0000) begin
F = A;
end
else if (FS == 4'b0001) begin
F = Incr[3:0];
Cout = Incr[4];
end
Cout也需要声明为reg。 output reg Cout
;
显示了一个工作示例EDA Playground。如果你仍然得到同样的错误,你必须至少错过其中一个错误。
正如Greg在评论中提到的那样,自动灵敏度列表是首选,因为这可以最大限度地降低RTL门级不匹配的可能性。对于自动敏感度列表always @*
当输出未完全定义时,这会导致推断出一个锁存器,好像没有分配一个值,它必须保持其值,而单独的组合逻辑是不能的。锁存器本身并不是很糟糕,但必须非常注意时间,意外的暗示通常意味着时间没有被考虑。
评论中还注意到,使用case
语句更好的做法是:
always @* begin
case(FS)
4'd0 : F = A;
4'd1 : begin
F = Incr[3:0];
Cout = Incr[4];
end
4'd2 : begin
F = Sum[3:0];
Cout = Sum[4];
end
endcase
end
以下两行也可以分为1行:
F = Incr[3:0];
Cout = Incr[4];
可以来{Cout, F} = Incr[4:0];
。