Verilog比较器

Verilog comparator

我是 verilog 的新手。

我研究了很多,终于写出了这段代码,但是好像不行。

谁能帮我修一下?

module comparator();
    reg[3:0] a, b;
    wire[1:0] equal, lower, greater;    

    if (a<b) begin

        equal = 0;
        lower = 1;
        greater = 0;
    end

    else if (a==b) begin
        equal = 1;
        lower = 0;
        greater = 0;
    end

    else begin
        equal = 0;
        lower = 0;
        greater = 1;
    end;

    initial begin
                $monitor($time, 
                         "a=%b, b=%b, greater=%b, equals=%b, lower=%b",
                          a, b, greater, equal, lower);

                a=9; b=10;
                #100 $display ("\n", $time, "\n");
        end
endmodule 

行为程序必须包含在 always 块中,如下所示: 此外,您的模块需要输入和输出。更正确的版本应该是这样的:

module comparator (
    input wire [3:0] a,
    input wire [3:0] b,
    output reg equal,
    output reg lower,
    output reg greater
    );

    always @* begin
      if (a<b) begin
        equal = 0;
        lower = 1;
        greater = 0;
      end
      else if (a==b) begin
        equal = 1;
        lower = 0;
        greater = 0;
      end
      else begin
        equal = 0;
        lower = 0;
        greater = 1;
      end
    end
endmodule

我建议阅读一些关于使用 Verilog 进行行为建模的教程,因为你错过了很多要点:

  • 如何在模块中正确定义输入和输出
  • 什么东西可以是电线,什么东西应该是调节器
  • 使用 always @* 对组合逻辑建模

最重要的是:如何编写测试平台。测试台被编写为没有输入和输出的模块)实例化您的 UUT(被测单元),提供输入,读取输出并检查它们是否有效。

module testcomp;
    reg [3:0] a, b;
    wire eq, lw, gr;

    comparator uut (
       .a(a),
       .b(b),
       .equal(eq),
       .lower(lw),
       .greater(gr)
    );

    initial begin
      a = 0;
      repeat (16) begin
        b = 0;
        repeat (16) begin
          #10;
          $display ("TESTING %d and %d yields eq=%d lw=%d gr=%d", a, b, eq, lw, gr);
          if (a==b && eq!=1'b1 && gr!=1'b0 && lw!=1'b0) begin
            $display ("ERROR!");
            $finish;
          end
          if (a>b && eq!=1'b0 && gr!=1'b1 && lw!=1'b0) begin
            $display ("ERROR!");
            $finish;
          end
          if (a<b && eq!=1'b1 && gr!=1'b0 && lw!=1'b1) begin
            $display ("ERROR!");
            $finish;
          end
          b = b + 1;
        end
        a = a + 1;
      end
      $display ("PASSED!");
      $finish;
    end
endmodule

您可以在 EDAPlayGround 使用这个 link 来玩这个例子: http://www.edaplayground.com/x/CPq

没有总是阻止:

module comparator (
  input wire [3:0] a,
  input wire [3:0] b,
  output reg equal,
  output reg lower,
  output reg greater
);
assign equal = (a===b);
assign lower = (a<b)?1'b1:1'b0;
assign greater = (a>b)1'b1:1'b0;
end

注意,您需要考虑 'X' 和 'Z',使用“===”而不是“==”