错误(10170):文本附近jmd_alub_v.v(31)处的Verilog HDL语法错误;“否则”;;
错误(10170):文本“else”附近jmd_alub_v.v(31)处的Verilog HDL语法错误 很多次都在期待这个错误,有人能帮我解决吗?我不知道问题出在哪里错误(10170):文本附近jmd_alub_v.v(31)处的Verilog HDL语法错误;“否则”;;,verilog,hdl,Verilog,Hdl,错误(10170):文本“else”附近jmd_alub_v.v(31)处的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,
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
如果要在
If
或else
中放入多个语句,则需要将它们括在开始
和结束
中,例如:
if (FS == 4'b0000)
F = A;
else if (FS == 4'b0001)
begin
F = Incr[3:0];
Cout = Incr[4];
end
if (FS == 4'b0000) begin
F = A;
end
else if (FS == 4'b0001) begin
F = Incr[3:0];
Cout = Incr[4];
end
如果在If/else中使用多个语句,则需要将它们括在
begin
和end
中。在学习Verilog时,我建议自由地使用它们,因为它可以避免常见错误并使重构更容易
例如:
if (FS == 4'b0000)
F = A;
else if (FS == 4'b0001)
begin
F = Incr[3:0];
Cout = Incr[4];
end
if (FS == 4'b0000) begin
F = A;
end
else if (FS == 4'b0001) begin
F = Incr[3:0];
Cout = Incr[4];
end
Cout还需要声明为reg<代码>输出寄存器Cout
给出了一个工作示例。如果您仍然遇到相同的错误,那么您肯定至少错过了其中一个错误
正如Greg在评论中提到的,自动灵敏度列表是首选的,因为这将RTL与门级不匹配的可能性降至最低。对于自动灵敏度列表始终@*
当一个输出没有完全定义时,这会导致一个锁存器被推断出来,就像没有分配一个值一样,它必须保持它的值,这是组合逻辑本身无法做到的。闩锁本身并不坏,但在计时时必须非常小心,意外影响通常意味着没有考虑计时
评论中还指出,最好使用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
以下两条生产线也可以合并为一条生产线:
F = Incr[3:0];
Cout = Incr[4];
可以是{code>{Cout,F}=Incr[4:0]我对整个代码都这样做了,但仍然得到相同的错误用更新的代码编辑问题,并用注释清楚地标识错误中引用的行。仅供参考:
Cout
是一个推断锁存,因为它不是在每种情况下都定义的<对于组合逻辑,重新启动代码>@*<代码>@(A、B、FS)是合法的,但自动敏感度列表更具可扩展性。你有一个长的其他如果链,考虑使用一个case语句代替。