Compiler errors ModelSim寄存器存在非法错误
所以我得到了错误 **错误:C:/Modeltech_pe_edu_10.3c/examples/HW6/alu.v(53):连续赋值的左侧寄存器非法 对于assign语句[assign result=32'd0;]你知道为什么吗?我已经尝试过在代码中移动这组语句,唯一有效的方法是完全删除代码的一部分 问题是,我需要它来运行我的测试台。关于这个错误意味着什么以及如何解决它,你有什么想法吗Compiler errors ModelSim寄存器存在非法错误,compiler-errors,verilog,modelsim,Compiler Errors,Verilog,Modelsim,所以我得到了错误 **错误:C:/Modeltech_pe_edu_10.3c/examples/HW6/alu.v(53):连续赋值的左侧寄存器非法 对于assign语句[assign result=32'd0;]你知道为什么吗?我已经尝试过在代码中移动这组语句,唯一有效的方法是完全删除代码的一部分 问题是,我需要它来运行我的测试台。关于这个错误意味着什么以及如何解决它,你有什么想法吗 // ///////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module alu
(
//--------------------------
// Input Ports
//--------------------------
input [31:0] operand0,
input [31:0] operand1,
input [3:0] control,
//--------------------------
// Output Ports
//--------------------------
output reg [31:0] result,
output zero,
output overflow
);
//--------------------------
// Bidirectional Ports
//--------------------------
// < Enter Bidirectional Ports in Alphabetical Order >
// None
///////////////////////////////////////////////////////////////////
// Begin Design
///////////////////////////////////////////////////////////////////
assign result = 32'd0;
assign zero = 1'b1;
assign overflow = 1'b0;
always @(*)
begin
case(control)
4'b0000: result = operand0 && operand1;
4'b0001: result = operand0 || operand1;
4'b0010: result = operand0 ^ operand1;
4'b0011: result = !(operand0 || operand1);
4'b0100: result = operand0 + operand1;
4'b0110: result = operand0 - operand1;
4'b1000: result = operand0 < operand1;
4'b1001: result = operand0 << operand1;
4'b1010: result = operand0 >> operand1;
4'b1011: result = operand0 >>> operand1;
endcase
end
endmodule
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
模块alu
(
//--------------------------
//输入端口
//--------------------------
输入[31:0]操作数0,
输入[31:0]操作数1,
输入[3:0]控件,
//--------------------------
//输出端口
//--------------------------
输出reg[31:0]结果,
输出零,
输出溢出
);
//--------------------------
//双向端口
//--------------------------
//<按字母顺序输入双向端口>
//没有
///////////////////////////////////////////////////////////////////
//开始设计
///////////////////////////////////////////////////////////////////
分配结果=32'd0;
指定零=1'b1;
分配溢出=1'b0;
始终@(*)
开始
病例(对照)
4'b0000:结果=操作数0和操作数1;
4'b0001:结果=操作数0 | |操作数1;
4'b0010:结果=操作数0^操作数1;
4'b0011:结果=!(操作数0 | |操作数1);
4'b0100:结果=操作数0+操作数1;
4'b0110:结果=操作数0-操作数1;
4'b1000:结果=操作数0<操作数1;
4'b1001:结果=操作数0>>操作数1;
尾声
结束
端模
首先:不能在assign
语句中分配类型reg
;这是Verilog的一条规则。“寄存器在连续赋值的左侧是非法的”表示寄存器不能通过assign
语句进行赋值。与=
左侧相同的左侧
第二:即使类型reg
可以在assign
语句中分配,也会在result
上有多个驱动程序,因为它是在always块中分配的assign
语句是连续的驱动程序,这意味着无论其他块对同一信号做什么,它都将始终对该信号应用一个值。如果存在任何冲突(例如一个应用1,另一个应用0),则结果将是'bx
解决方案:删除以下行:assignresult=32'd0代码>结果
是组合逻辑,不需要初始值