8位alu中输出值错误

时间:2014-05-23 06:35:39

标签: verilog modelsim alu

我想写一个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

1 个答案:

答案 0 :(得分:2)

ab只有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,八进制为oh为十六进制为width'formatValue

注意

outp如果没有定义,将是一个隐含的1位线。

你在testharness的时钟也只有1个正边缘。您可能更喜欢将时钟定义为:

initial begin
  clk = 1'b0;
  forever begin
    #100 clk = ~clk;
  end
end

上述完整版本在EDAplayground展示。