【问题标题】:Verilog test bench for 4-bit adder with Carry Lookahead [duplicate]带有超前进位的 4 位加法器的 Verilog 测试台 [重复]
【发布时间】:2021-08-28 12:45:56
【问题描述】:

老实说,考虑到我只创建过一次幼稚的简单项目,我对 Verilog 尤其是测试台还有些陌生。我不确定如何为我制作的 Verilog 文件制作测试平台,因此无法测试它是否有效。这是我的代码:

`timescale 1ns/1ps

module adder_4bit_cla(sum, Cout, A, B, S);

    input [3:0] A, B;
    input S;
    output [3:0] sum;
    output Cout;
    
    wire P0, G0, P1, G1, P3, G3;
    wire C4, C3, C2, C1;
    
    assign
        P0 = A[0] ^ B[0],
        P1 = A[1] ^ B[1],
        P2 = A[2] ^ B[2],
        P3 = A[3] ^ B[3];
        
    assign
        G0 = A[0] & B[0],
        G1 = A[1] & B[1],
        G2 = A[2] & B[2],
        G3 = A[3] & B[3];
        
    assign
        C1 = G0 | (P0 & S),
        C2 = G1 | (P1 & G0) | (P1 & P0 & S),
        C3 = G2 | (P2 & G1) | (P2 & P1 & G0) | (P2 & P1 & P0 & S),
        C4 = G3 | (P3 & G2) | (P3 & P2 & G1) | (P3 & P2 & P1 & G0) | (P3 & P2 & P1 & P0 & S);
        
    assign
        sum[0] = P0 ^ S,
        sum[1] = P1 ^ C1,
        sum[2] = P2 ^ C2,
        sum[3] = P3 ^ C3;
        
    assign Cout = C4;
    
endmodule

老实说,我真正需要做的是使用进位先行的 4 位加减法器,但我不知道如何实现进位先行,所以我在这里。如果有人可以帮助我,那就太好了:

编辑:我已经冷静下来,我终于可以确定确切的问题:测试台的 A 和 B 的值。虽然我可以暴力破解它,但我怎样才能使用循环来增加 A 和 B 以便它会是这样的:

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

同时更新M?

【问题讨论】:

  • 在测试台中,您只需要考虑输入和输出信号。根据给定的输入信号,您可以验证输出信号的行为是否符合预期。
  • @KavinduVIndika 对 @KavinduVIndika 感到抱歉,但如果您仍然有兴趣帮助我解决问题,我已经编辑了帖子。
  • 很好,这意味着您想使用循环在测试台中提供输入数据吗?

标签: verilog hdl


【解决方案1】:

使用以下内容来改进您的测试平台。

`timescale 1ns / 1ps

module adder_4bit_cla_tb();

// inputs - keep them having reg as the data type 
reg [3:0] A, B;
reg S;

// outputs - keep them having wire as the data type 
wire [3:0] sum;
wire Cout;


adder_4bit_cla adder_4bit_cla_inst
                  (
                 .sum(sum), .Cout(Cout), .A(A), .B(B), .S(S)
                  );

initial begin
       
    A = 4'd1; B = 4'd2; S = 1'd1;
    
    #10 A = 4'd2; B = 4'd5; S = 1'd0;
    
    #10 A = 4'd5; B = 4'd6; S = 1'd0;

    #50 $stop;
    
end
endmodule

波形结果

可以使用 for 循环输入输入,如下所示。


`timescale 1ns / 1ps

module adder_4bit_cla_tb();

// inputs - keep them having reg as the data type 
reg [3:0] A, B;
reg S;

// outputs - keep them having wire as the data type 
wire [3:0] sum;
wire Cout;

reg [3:0] i; 

adder_4bit_cla adder_4bit_cla_inst
                  (
                 .sum(sum), .Cout(Cout), .A(A), .B(B), .S(S)
                  );

initial begin
     
    for(i = 4'd0; i < 4'd15; i = i + 4'd1) begin  
    
    A = i; B = i; S = 1'b0;
    
    #10;
    
    end
    
    #200 $stop;
    
end
endmodule

波形结果

【讨论】:

  • 您好!我几乎得到了regs 和wires 的正确性,但我不确定我是否理解从initial beginend 的代码块。我不需要循环来遍历AB 的所有可能值吗?
  • Initial beginend 表示您要评估的完整过程。使用#{time},您可以定义相关输入需要在多长时间内保持不变而不发生变化。在这种情况下,时间刻度以 纳秒 为单位。
  • 通过#10 A = 4'b2; B = 4'b3;,您在处理输入之前给出了 10 ns。当您在输入输入后有 #10 时,这意味着您在输入输入后等待 10 ns。
  • 您好,最后一件事很抱歉。我花了一些时间,因为当我将您的一部分代码转移到我的代码并更改变量时,我正在调试一些东西。但是我确实遇到了一些事情:S 没有变化,它一直是 0。这是故意的吗?
  • 是的,如果您检查此行A = i; B = i; S = 1'b0;,我将向 S 提供 0 以完成整个过程。您可以在 for 循环中为其提供任何值,并且可以按照我在 A 和 B 中所做的类似方式对其进行模式化,如上一行所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多