我正在设计 ALU,它有 4 位输入 2 位操作代码,4 位结果输出用于加减运算。和 4 位 ALUflag 输出。
我认为我的测试平台可能是错误的,因为我没有找到任何有用的 ALU 测试平台,尤其是在 systemverilog 中。这是我的 ALU 和测试台代码。我还得到了名为 MUX2、MUX4、Fulladder 的文件,我已经知道它们工作正常。
我的ALU代码。
module alu( input logic [3:0] A, B,
input logic [1:0] ALU_control,
output logic [3:0] Result,
output logic [3:0] ALU_flag );
wire [3:0] mux2_output;
MUX2 k_0(B,~B,ALU_control[0],mux2_output) ;
wire [3:0] sum;
wire [2:0] c;
fulladder i_0 (A[0],mux2_output[0],ALU_control[0],sum[0],c[0]);
fulladder i_1 (A[1],mux2_output[1],c[0],sum[1],c[1]);
fulladder i_2 (A[2],mux2_output[2],c[1],sum[2],c[2]);
fulladder i_3 (A[3],mux2_output[3],c[2],sum[3],Cout);
MUX4 j_0(sum,sum,A&B,A|B,ALU_control,Result);
assign ALU_flag[3] = ~Result;
assign ALU_flag[2] = Result;
assign ALU_flag[1] = Cout & ~ALU_control[1];
assign ALU_flag[0] = (A ~^ B ~^ ALU_control[0]) & ~ALU_control[1];
endmodule
和我的测试台代码
module alu_test();
logic [3:0] A, B, Result, ALU_flag;
logic [1:0] ALU_control;
alu dut(
.A(A),
.B(B),
.Result(Result),
.ALU_Flag(ALU_flag)
);
initial begin
A = 1100; B = 0011; ALU_control = 00; #20;
$display(Res,Flag);
end
endmodule
是的,你的测试平台有问题。如果你的模拟器没有给你编译错误,那么试试其他模拟器,比如 EDA Playground 上的那些。
当我使用 Cadence 模拟器时,例如,我得到这些错误:
$display(Res,Flag);
|
xmelab: *E,CUVUNF (./tb.sv,14|18): Hierarchical name component lookup failed for 'Res' at 'alu_test'.
$display(Res,Flag);
|
xmelab: *E,CUVUNF (./tb.sv,14|23): Hierarchical name component lookup failed for 'Flag' at 'alu_test'.
你声明了一个名为
Result
的信号,但是你没有声明一个名为Res
的信号。
更改时这些错误消失:
$display(Res,Flag);
至:
$display(Result,ALU_flag);
另一个可能的问题是在这一行:
A = 1100; B = 0011; ALU_control = 00; #20;
所有这些数字都是十进制格式。您可能希望它们采用二进制格式,这需要您使用
'b
基本前缀:
A = 'b1100; B = 'b0011; ALU_control = 'b00; #20;