所以我试图使用逻辑门在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
答案 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]
希望你能理解其中的差异。