Verilog错误:应为冒号,并应为等号

Verilog错误:应为冒号,并应为等号,verilog,Verilog,我目前正在使用Quartus 16.0编写一份关于ALU的作业。作为一名Verilog的初学者,由于缺乏相关知识,我真的度过了一段不愉快的时光。 试图在代码中找到问题,但仍然需要帮助 reg [7:0] ALUout; always@(*) begin case(keys[2:0]) 3'b000: add plus(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .s

我目前正在使用Quartus 16.0编写一份关于ALU的作业。作为一名Verilog的初学者,由于缺乏相关知识,我真的度过了一段不愉快的时光。 试图在代码中找到问题,但仍然需要帮助

reg [7:0] ALUout;
    always@(*)
    begin
    case(keys[2:0])
    3'b000: add plus(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .s0(ALUout[0]), .s1(ALUout[1]), .s2(ALUout[2]), .s3(ALUout[3]), .cout(ALUout[4]));
    3'b001: ALUout = A + B;
    3'b010: ALUout = {A | B, A ^ B};
    3'b011: function3 u0(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .Out(ALUout)); 
    3'b100: function4 u1(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .Out(ALUout));
    endcase
end
以下是错误消息:


错误(10170):文本“plus”附近Lab3Part3.v(274)处的Verilog HDL语法错误;应为“您不能在过程块内实例化模块。请将模块实例化移到always块外,并将模块的输出连接到适当宽度的导线。在always块中,引用导线

此外,
ALOUT
需要在always块内的所有可能组合中具有已知的赋值。否则可能会推断出复杂锁存。应使用
默认值
来处理值为5、6或7的
键[2:0]
的条件

reg [7:0] ALUout;
wire [4:0] add_out;
wire [7:0] func3_out, func4_out;
add plus(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .s0(add_out[0]), .s1(add_out[1]), .s2(add_out[2]), .s3(add_out[3]), .cout(add_out[4]));
function3 u0(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .Out(func3_out));
function4 u1(.a0(a0), .a1(a1), .a2(a2), .a3(a3), .b0(b0), .b1(b1), .b2(b2), .b3(b3), .Out(func4_out));
always@(*)
    begin
    case(keys[2:0])
    3'b000: ALUout = {3'b0,add_out}; // leading zero padding
    3'b001: ALUout = A + B;
    3'b010: ALUout = {A | B, A ^ B};
    3'b011: ALUout = func3_out;
    3'b100: ALUout = func4_out;
    default: ALUout = 8'b0; // without this like ALUout would be an inferred latch
    endcase
end