结构2-1多路复用器在精心制作期间失败

时间:2016-02-10 00:07:06

标签: verilog

所以我试图使用逻辑门在Verilog中编写一个简单的2-1 mux,我不确定我做错了什么。多路复用器的代码如下:

module MUX_2_1 (i0 ,i1, sel ,o);
    input [31:0] i0, i1;
    input sel;
    output [31:0] o;

    wire [31:0] a, b;

    and #(8) and1(a, {32{sel}}, i0);
    and #(8) and2(b, {32{~sel}}, i1);
    or  #(8)  or1(o, a, b);
endmodule

该模块编译正常,但是当我详细说明我的测试台时,我会得到几个错误(每个门一个),其形式为

  

gate(and1)具有非法输出规范。

我理解如何使用数据流编写相同的多路复用器,但我很好奇这里的实际问题是什么。我在网上找不到任何暗示上述代码不起作用的内容。

供参考,这是我的测试台代码:

module test_bench;
    reg [31:0] I0, I1, I2, I3, I4, I5, I6, I7;
    reg [2:0] SEL;
    wire [31:0] O8;

    //MUX_8_1 mux(I0, I1, I2, I3, I4, I5, I6, I7, SEL, O8);
    MUX_2_1 mux(I0, I1, SEL[0], O8);

    initial
        begin
            I0 = 1;
            I1 = 2;
            I2 = 4;
            I3 = 8;
            I4 = 16;
            I5 = 32;
            I6 = 64;
            I7 = 128;

            SEL = 3'b000;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b001;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b010;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b011;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b111;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b110;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b100;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
            SEL = 3'b101;
            #50 $display("SEL = %u, O8 = %u\n", SEL, O8);
        end
endmodule

1 个答案:

答案 0 :(得分:1)

您所做的就是重写了模块的参数(在您的情况下是原语)。

要分配门的延迟,只使用#<delay_value>因此,实例化可能如下所示:

and #8 and1...;
and #8 and2...;
or  #8 or1...;

Paremeter完全是一个非常不同的东西。

  

Verilog将参数定义为在其中声明的常量值   模块结构。该值可用于定义一组   模块的属性,也可以表征其行为   作为其物理代表

假设你想制作一个verilog代码,对于网络数量是可靠的或可配置的,那么你可以使用这些参数。

例如:

module x (a, b);
  input [SIZE-1:0] a;
  output [SIZE-1:0] b;

  parameter SIZE = 4;

  // Your actual Verilog code
endmodule

因此,此代码默认生成a[3:0], b[3:0]。但是,因为它由SIZE值参数化。可以覆盖SIZE值以获得不同数量的网络。

要覆盖参数值,您可以使用#(<Paramter 1 Value>, <Parameter 2 Value>, ..., <Parameter n Value>)

因此,如果您实例化模块x,SIZE = 6,那么您应该写如下:

x x1 #(6) (a, b); // Here SIZE = 6, and so 1[5:0], b[5:0]

希望你能理解其中的差异。