我正在尝试使用特定的功能代码实现ALU。
由于某些原因,下面的代码没有运行,并且根据编译器有错误。
错误(可抑制):alu.v(61):( vlog-2388)已在此范围(alu)中声明'结果'。
错误(可抑制):alu.v(67):( vlog-2388)'operand0'已在此范围内声明(alu)。
错误(可抑制):alu.v(67):( vlog-2388)'operand1'已在此范围内声明(alu)。
错误(可抑制):alu.v(68):( vlog-2388)'control'已在此范围内声明(alu)。
错误:(vlog-13069)alu.v(71):near“< =”:语法错误,意外< =。
错误:alu.v(71):( vlog-13205)在'result'后面的范围内发现语法错误。缺少'::'吗?
如果我将结果,操作数0,操作数1和控制的声明删除为有线和寄存器,我仍然会收到错误,说“结果”超出范围或无法访问。我真的很困惑这一部分,非常感谢任何帮助。
我觉得问题出在了regs和wire的某个地方,但我不确定。
module alu
(
//--------------------------
// Input Ports
//--------------------------
input [31:0] operand0,
input [31:0] operand1,
input [3:0] control,
//--------------------------
// Output Ports
//--------------------------
output [31:0] result,
output zero,
output overflow
);
// Signal Declarations: local params
// Signal Declarations: reg
// Signal Declarations: wire
always @(*)
begin
case(control)
4'b0000: result= operand0 | operand1; // OR
4'b0001: begin
result= operand0 & operand1; // AND
end
default: result = 4'b0;
endcase
end
endmodule
我将上面的代码更改为修改后的版本。我仍然会遇到错误:
现在说: (vlog-2110)非法引用网络“结果”。 3次
答案 0 :(得分:2)
您的代码存在一些问题。有两种声明输入和输出的方法:
module alu (
input [31:0] operand0,
input [31:0] operand1,
input [3:0] control,
output reg [31:0] result,
output zero,
output overflow
);
和第二种方法是:
module (operand0,operand1,control,result,zero,overflow);
input [31:0] operand0;
input [31:0] operand1;
input [3:0] control;
output reg [31:0] result;
output zero;
output overflow;
我希望你能看出差异。因此,在您的代码中,您将重新声明输入和输出。
同样非阻塞分配,即< = 通常用于顺序逻辑。对于组合逻辑,阻塞分配是优选的,即 = 。
如果您想将输出定义为 reg ,则必须在始终块内使用,否则将其定义为电线。
您的代码可以写成如下:
module alu
(
input [31:0] operand0,
input [31:0] operand1,
input [3:0] control,
output reg [31:0] result,
output zero,
output overflow
);
always @(*)
begin
case(control)
4'b0000: result= operand0 | operand1; // OR
4'b0001: begin
result= operand0 & operand1; // AND
end
default : result =4'b0;
endcase
end
endmodule