我想写一个8位ALU。我编写了这段代码但是当我模拟它时,输出有x值,为什么会这样?我有另一个问题,我不知道如何在Modelsim模拟中显示8位参数,而我只有两个值0或1?
module eightBitAlu(clk, a, b,si,ci, opcode,outp);
input clk;
input [7:0] a, b;
input [2:0] opcode;
input si;
input ci;
output reg [7:0] outp;
always @(posedge clk)
begin
case (opcode)
3'b000: outp <= a - b;
3'b000 : outp <= a + b;
3'b001 : outp =0;
3'b010 : outp <= a & b;
3'b011 : outp <= a | b;
3'b100 : outp <= ~a;
endcase
end
endmodule
这是我的测试模块
module test_8bitAlu();
reg clk=0,a=3,b=1,si=0,ci=0,opcode=1;
eightBitAlu alu(clk, a, b,si,ci, opcode,outp);
initial begin
#200 clk=1;
#200 opcode=0;
#200 opcode=2;
#200 opcode=3;
#200 opcode=4;
#200;
end
endmodule
答案 0 :(得分:2)
a
和b
只有1位宽,导致输入端口的前7位无法驱动。
reg clk=0,a=3,b=1,si=0,ci=0,opcode=1;
相当于:
reg clk = 0;
reg a = 3;
reg b = 1;
reg si = 0;
reg ci = 0;
reg opcode = 1;
您需要的是:
reg clk = 0;
reg [7:0] a = 3;
reg [7:0] b = 1;
reg si = 0;
reg ci = 0;
reg [2:0] opcode = 1;
wire [7:0] outp;
进一步改进网络将包括整数赋值的宽度,即:
reg clk = 1'd0;
reg [7:0] a = 8'd3;
二进制为 b
,十进制为d
,八进制为o
,h
为十六进制为width'formatValue
outp
如果没有定义,将是一个隐含的1位线。
你在testharness的时钟也只有1个正边缘。您可能更喜欢将时钟定义为:
initial begin
clk = 1'b0;
forever begin
#100 clk = ~clk;
end
end
上述完整版本在EDAplayground展示。