我是verilog的新手。我正在使用Xilinx IDE。我的ALU模块如下:
module ALU(in1,in2,operation,clk,out
);
input [15:0] in1;
input [15:0] in2;
input [3:0] operation;
input clk;
output[15:0] out;
reg [15:0] out;
always@(posedge clk)
begin
case(operation)
4'b0010:
out <= in1+in2;
4'b0011:
out <= in1-in2;
4'b0100:
out <= !in1;
4'b0101:
out <= in1<<in2;
4'b0110:
out <= in1>>in2;
4'b0111:
out <= in1&in2;
4'b1000:
out <= in1|in2;
//4'b1001:
// out = in1>=in2?16'd0:16'd1;
default: out <= 16'hFFFF;
endcase
end
endmodule
我的测试平台如下
module test_projectALU;
reg [15:0] in1;
reg [15:0] in2;
reg [3:0] operation;
reg [15:0] out;
reg clk;
ALU PA(in1,in2,operation,out);
initial
begin
operation=4'b0000;
in1=4'b0000;
in2=4'b0000;
clk = 0;
end
always
begin
#2 operation=4'b0010; in1=4'b0011; in2=4'b0000;
#2 operation=4'b0011; in1=4'b0001; in2=4'b0011;
#2 operation=4'b0000; in1=4'b1100; in2=4'b1101;
#2 operation=4'b0011; in1=4'b1100; in2=4'b1101;
end
always
begin
#5 clk=~clk;
end
initial $monitor($time,"f=%b, a=%b, b=%b,c=%b",operation,in1,in2,out);
//initial #10 $stop;
endmodule
我的模拟输出附有图像。
为什么没有定义输出(X状态)? 我做错了什么?
答案 0 :(得分:3)
out
是X,因为它永远不会被赋值。您错误地将它连接到clk
模块实例的ALU
端口。我的模拟器给了我一个警告:
ALU PA(in1,in2,operation,out);
|
ncelab: *W,CUVWSP (./tb.v,41|5): 1 output port was not connected: out
变化:
ALU PA(in1,in2,operation,out);
为:
ALU PA(in1,in2,operation,clk,out);
使用按名称连接而不是按位置连接可以帮助避免此类常见错误:
ALU PA (
// Inputs:
.clk (clk),
.in1 (in1),
.in2 (in2),
.operation (operation),
// Outputs:
.out (out)
);
答案 1 :(得分:0)
ALU是输出端口,因此在测试台中的 out 之前,将 reg 转换为 wire 。 由于您已使用相同的命名来编写变量,因此编写模块声明如下: ALU PA(in1,in2,操作,clk,out);