0

半加法器:

`timescale = 1ns/100ps //timescale ratio //actual HDL

module half_add(a,b,sum, carry);
  input a,b;
  output sum, carry;

  wire sum, carry;

  and(sum,a,b);
  xor(carry,a,b);
endmodule

试验台:

module half_addTB;
reg a,b;
wire carry, sum;

//instantiation
half_add half_add1(
.a(a),.b(b),.carry(carry),.sum(sum));

 //port assignments with 10ns delays
initial begin
  #10 a = 0; b= 0;
  #10 b = 1;
  #10 a = 1;
  #10 b = 0;
end

endmodule

代码编译得很好......但是当我尝试模拟它时,我所有的值都处于 az 状态......我不明白为什么......

4

2 回答 2

2

您不能从模块内部驱动模块的输入。

只需在另一个没有任何输入的模块/程序(例如“half_add_tb”)中实例化您的“half_add”模块。然后添加两个本地regs“a”和“b”,并从一个初始块中驱动它们,就像你写的那样——但是在“half_add_tb”模块中。

然后只需将“half_add”实例的输入“a”和“b”连接到本地“a”和“b”regs。

于 2013-09-30T06:47:29.917 回答
1

您需要在测试工具中实例化您的设计,然后驱动输入。

//Half Adder
module half_add(a, b, sum, carry);
  input  a,b;
  output sum, carry;
  wire   sum, carry; //Outputs are wires by default this is not required

  and(sum,  a, b);
  xor(carry,a, b);
endmodule

module testharness();
 //create test signals
 reg a; //1 bit reg (regs driven from always and initial blocks)
 reg b;
 wire sum; // 1 bit wires for outputs to drive
 wire carry;

  //instantiate DUT (Device under test)
  half_add half_add_1(
    .a     ( a    ), 
    .b     ( b    ), 
    .sum   ( sum  ), 
    .carry ( carry)
  );

  //begin testbench
  initial begin 
    #100 $finish;
  end

  initial begin
    #10 a = 0; b= 0;
    #10 b = 1;
    #10 a = 1;
    #10 b = 0;
  end

endmodule

注意:如果您的模拟器支持 verilog-2001,您的端口列表会更易于阅读且更紧凑:

//Half Adder
module half_add(
  input       a, 
  input       b,
  output wire sum,  
  output wire carry
//for regs : 
//    output reg [WIDTH-1:0] out_reg
//multi-bit wires : 
//    output     [WIDTH-1:0] out_wire
);

  and(sum,  a, b);
  xor(carry,a, b);
endmodule
于 2013-09-30T07:26:52.960 回答