意外的高阻抗输出
Unexpected high impedance output
我正在为我正在设计的处理器(第一个 RTL 项目)编写一个 ALU,并且当我 运行 我的测试台时,我在 ALU_out
上获得高阻抗输出,即使标志确实设置并正确输出。
module alu(
input clk,
input reset,
input [7:0] A, B,
input [3:0] Op_Sel,
output [7:0] ALU_out,
output C, V, N, Z
);
reg [8:0] Result = 0;
reg [8:0] cn_temp = 0;
reg [7:0] v_temp = 0;
reg carry = 0;
reg overflow = 0;
reg negative = 0;
reg zero = 0;
assign ALU_Out = Result[7:0];
assign C = carry;
assign V = overflow;
assign N = negative;
assign Z = zero;
always @*
begin
if (reset)
begin
Result = 0;
cn_temp = 0;
v_temp = 0;
carry = 0;
overflow = 0;
negative = 0;
zero = 0;
end
end
always @(posedge clk)
begin
case(Op_Sel)
4'b0000: // Addition
begin
Result = A + B;
negative = Result[7];
zero = (Result[7:0] == 8'b00000000);
carry = Result[8];
v_temp = A[6:0] + B[6:0];
overflow = v_temp[7] ^ carry;
end
.
.
//The rest of the instructions
.
.
.
endcase
end
endmodule
//My testbench
module alu_testbench();
reg clk;
reg reset;
reg [7:0] A;
reg [7:0] B;
reg [3:0] Op_Sel;
wire [7:0] ALU_out;
wire C, V, N, Z;
always begin
#1
clk = ~clk;
end
initial begin
clk = 0;
reset = 0;
#1
reset = 1;
#1
reset = 0;
end
initial begin
#10
A=2;
B=3;
Op_Sel = 4'b0000;
#10
A=1;
end
alu alu (
.clk(clk),
.A(A),
.B(B),
.Op_Sel(Op_Sel),
.ALU_out(ALU_out),
.C(C),
.V(V),
.N(N),
.Z(Z));
endmodule
我相信我已将模块连接到测试台(通过电线),那么为什么我在 ALU_out
上出现高阻抗?
这是一个棘手的错字。您在 ALU_Out
信号名称中错误地使用了大写字母“O”。由于 Verilog 区分大小写,因此这是与 ALU_out
不同的信号。在 Verilog 中声明所有信号不是强制性的。但是,您可以在代码中使用以下编译器指令来帮助捕获此类常见问题:
`default_nettype none
您的模拟器应该会产生错误。
要修复它,请更改:
assign ALU_Out = Result[7:0];
至:
assign ALU_out = Result[7:0];
我的模拟器也生成了一条警告消息,因为您没有驱动 alu
的 reset
输入。这是修复:
alu alu (
.clk(clk),
.reset(reset), /// <------ add this
.A(A),
.B(B),
.Op_Sel(Op_Sel),
.ALU_out(ALU_out),
.C(C),
.V(V),
.N(N),
.Z(Z));
我正在为我正在设计的处理器(第一个 RTL 项目)编写一个 ALU,并且当我 运行 我的测试台时,我在 ALU_out
上获得高阻抗输出,即使标志确实设置并正确输出。
module alu(
input clk,
input reset,
input [7:0] A, B,
input [3:0] Op_Sel,
output [7:0] ALU_out,
output C, V, N, Z
);
reg [8:0] Result = 0;
reg [8:0] cn_temp = 0;
reg [7:0] v_temp = 0;
reg carry = 0;
reg overflow = 0;
reg negative = 0;
reg zero = 0;
assign ALU_Out = Result[7:0];
assign C = carry;
assign V = overflow;
assign N = negative;
assign Z = zero;
always @*
begin
if (reset)
begin
Result = 0;
cn_temp = 0;
v_temp = 0;
carry = 0;
overflow = 0;
negative = 0;
zero = 0;
end
end
always @(posedge clk)
begin
case(Op_Sel)
4'b0000: // Addition
begin
Result = A + B;
negative = Result[7];
zero = (Result[7:0] == 8'b00000000);
carry = Result[8];
v_temp = A[6:0] + B[6:0];
overflow = v_temp[7] ^ carry;
end
.
.
//The rest of the instructions
.
.
.
endcase
end
endmodule
//My testbench
module alu_testbench();
reg clk;
reg reset;
reg [7:0] A;
reg [7:0] B;
reg [3:0] Op_Sel;
wire [7:0] ALU_out;
wire C, V, N, Z;
always begin
#1
clk = ~clk;
end
initial begin
clk = 0;
reset = 0;
#1
reset = 1;
#1
reset = 0;
end
initial begin
#10
A=2;
B=3;
Op_Sel = 4'b0000;
#10
A=1;
end
alu alu (
.clk(clk),
.A(A),
.B(B),
.Op_Sel(Op_Sel),
.ALU_out(ALU_out),
.C(C),
.V(V),
.N(N),
.Z(Z));
endmodule
我相信我已将模块连接到测试台(通过电线),那么为什么我在 ALU_out
上出现高阻抗?
这是一个棘手的错字。您在 ALU_Out
信号名称中错误地使用了大写字母“O”。由于 Verilog 区分大小写,因此这是与 ALU_out
不同的信号。在 Verilog 中声明所有信号不是强制性的。但是,您可以在代码中使用以下编译器指令来帮助捕获此类常见问题:
`default_nettype none
您的模拟器应该会产生错误。
要修复它,请更改:
assign ALU_Out = Result[7:0];
至:
assign ALU_out = Result[7:0];
我的模拟器也生成了一条警告消息,因为您没有驱动 alu
的 reset
输入。这是修复:
alu alu (
.clk(clk),
.reset(reset), /// <------ add this
.A(A),
.B(B),
.Op_Sel(Op_Sel),
.ALU_out(ALU_out),
.C(C),
.V(V),
.N(N),
.Z(Z));