You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为3位Verilog比较器测试代码添加无符号/有符号控制信号US

解决带无符号/有符号控制的3位比较器及测试平台问题

我来帮你搞定这个需求!首先先把你没写完的比较器代码补全,确保逻辑完整,然后再给你写包含US控制信号的测试平台,帮你验证两种模式下的比较效果。

完整的3位比较器代码

首先是补全后的比较器模块,这里要注意US信号的分支逻辑:

module comparator(
    input [2:0] A,
    input [2:0] B,
    input US,
    output reg G,  // A > B 时为高
    output reg E,  // A == B 时为高
    output reg L   // A < B 时为高
);

always @(*) begin
    if (US == 0) begin  // 有符号模式:用$signed转换后比较
        L = $signed(A) < $signed(B);
        E = $signed(A) == $signed(B);
        G = $signed(A) > $signed(B);
    end else begin       // 无符号模式:直接比较(Verilog默认无符号,也可以显式用$unsigned)
        L = A < B;
        E = A == B;
        G = A > B;
    end
end

endmodule

这里的核心逻辑是:

  • 当US=0时,把A和B用$signed()转换为有符号数进行比较(3位有符号数的范围是-4到3)
  • 当US=1时,直接按无符号数比较(范围是0到7)

带US控制信号的测试平台代码

接下来是测试平台,我们会生成不同的US状态,搭配各种典型的A、B输入,同时打印出比较结果,方便你直观验证:

module comparator_tb;

reg [2:0] A;
reg [2:0] B;
reg US;
wire G, E, L;

// 例化比较器模块
comparator uut(
    .A(A),
    .B(B),
    .US(US),
    .G(G),
    .E(E),
    .L(L)
);

initial begin
    // 初始化信号
    A = 3'b000;
    B = 3'b000;
    US = 1'b0;
    
    // 打印表头
    $display("US | A   | B   | G | E | L | 模式说明");
    $display("---------------------------------------");
    
    // 测试有符号模式(US=0)
    US = 0;
    // 测试负数 vs 正数:A=-4(100), B=3(011)
    A = 3'b100; B = 3'b011;
    #10 $display("0  | %b | %b | %b | %b | %b | 有符号:-4 < 3", A, B, G, E, L);
    // 测试负数 vs 负数:A=-1(111), B=-2(110)
    A = 3'b111; B = 3'b110;
    #10 $display("0  | %b | %b | %b | %b | %b | 有符号:-1 > -2", A, B, G, E, L);
    
    // 测试无符号模式(US=1)
    US = 1;
    // 同样的数值,无符号下:A=4(100), B=3(011)
    A = 3'b100; B = 3'b011;
    #10 $display("1  | %b | %b | %b | %b | %b | 无符号:4 > 3", A, B, G, E, L);
    // 无符号下:A=7(111), B=6(110)
    A = 3'b111; B = 3'b110;
    #10 $display("1  | %b | %b | %b | %b | %b | 无符号:7 > 6", A, B, G, E, L);
    
    // 测试相等的情况
    US = 0;
    A = 3'b101; B = 3'b101;  // 有符号下是-3
    #10 $display("0  | %b | %b | %b | %b | %b | 有符号:相等", A, B, G, E, L);
    
    #10 $finish;
end

endmodule

测试说明

你可以把这两段代码放到Verilog仿真工具(比如ModelSim、Vivado Simulator)里运行,观察打印的结果:

  • 当US=0时,100会被解析为有符号的-4,和011(3)比较会得到L=1(A < B)
  • 当US=1时,同样的100会被解析为无符号的4,和011(3)比较会得到G=1(A > B)
  • 负数之间的有符号比较也会符合预期,比如111(-1)大于110(-2)

这样你就能清晰看到US信号如何切换比较器的解析模式啦!

内容的提问来源于stack exchange,提问作者redbulln

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:30:23