1

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

1 回答 1

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展示了上述内容的完整版本。

于 2014-05-23T06:58:32.683 回答