Verilog比较器

时间:2015-04-11 20:10:49

标签: 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 

2 个答案:

答案 0 :(得分:8)

行为程序必须包含在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进行行为建模的教程,因为你错过了很多要点:

  • 如何在模块中正确定义输入和输出
  • 什么东西可以成为电线,什么东西应该是regs
  • 使用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上播放此示例: http://www.edaplayground.com/x/CPq

答案 1 :(得分:0)

总是阻止:

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',使用“===”而不是“==”