如何为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
相关产品推荐
相关产品推荐

