将 5 位总线连接到 32 位输出总线
Connect 5-bit bus to 32-bit output bus
我的设计需要多个多路复用器,它们都有两个输入,大多数是 32 位宽。我从设计 32 位 2:1 多路复用器开始。
现在我需要一个 5 位 2:1 多路复用器,我想重新使用我的 32 位设计。连接输入很容易(见下面的代码),但我很难连接输出。
这是我的代码:
reg [4:0] a, b; // Inputs to the multiplexer.
reg select; // Select multiplexer output.
wire [4:0] result; // Output of the multiplexer.
multiplex32_2 mul({27'h0, a}, {27'h0, b}, select, result);
当我通过 iverilog 运行 代码时,我收到一条警告,指出多路复用器需要 32 位输出,但连接的总线只有 5 位宽。模拟显示了预期的结果,但我想去掉警告。
有没有办法告诉 iverilog 忽略多路复用器输出的 27 个未使用位,或者我有 将 32 位宽的总线连接到多路复用器的输出?
我不知道可以在 Verilog 中使用的 #pragma
或类似的东西(类似于 C 中的 #pragma argsused
)。
例如,Xilinx ISE 有一个名为 "message filtering" 的功能,它允许设计人员静音特定的警告消息。你找到它们一次,select它们,选择忽略,后续合成不会触发这些警告。
也许您可以以不需要 "waste" 连接的方式设计您的多路复用器(但实际上并没有浪费,因为合成器将从网表中删除未使用的连接)。一个更优雅的解决方案是使用参数化模块,并以所需的宽度对其进行实例化。像这样:
module mux #(parameter WIDTH=32) (
input wire [WIDTH-1:0] a,
input wire [WIDTH-1:0] b,
input wire sel,
output wire [WIDTH-1:0] o
);
assign o = (sel==1'b0)? a : b;
endmodule
这个模块已经通过这个简单的测试平台进行了测试,它向您展示了如何使用参数实例化一个模块:
module tb;
reg [31:0] a1,b1;
reg sel;
wire [31:0] o1;
reg [4:0] a2,b2;
wire [4:0] o2;
mux #(32) mux32 (a1,b1,sel,o1);
mux #(5) mux5 (a2,b2,sel,o2);
// Best way to instantiate them:
// mux #(.WIDTH(32)) mux32 (.a(a1),.b(b1),.sel(sel),o(o1));
// mux #(.WIDTH(5)) mux5 (.a(a2),.b(b2),.sel(sel),.o(o2));
initial begin
$dumpfile ("dump.vcd");
$dumpvars (1, tb);
a1 = 32'h01234567;
b1 = 32'h89ABCDEF;
a2 = 5'b11111;
b2 = 5'b00000;
repeat (4) begin
sel = 1'b0;
#10;
sel = 1'b1;
#10;
end
end
endmodule
您可以使用此 Eda 游乐场自行测试 link:
http://www.edaplayground.com/x/Pkz
我认为问题与仍然是 5 位宽的多路复用器的输出有关。您可以通过执行以下操作来解决它:
reg [4:0] a, b; // Inputs to the multiplexer.
reg select; // Select multiplexer output.
wire [31:0] temp;
wire [4:0] result; // Output of the multiplexer.
multiplex32_2 mul({27'h0, a}, {27'h0, b}, select, temp);
assign result = temp[4:0];
这可以在 http://www.edaplayground.com/ 中使用以下代码轻松测试:
(我重新使用了@mcleod_ideafix的代码)
// Code your testbench here
// or browse Examples
module mux #(parameter WIDTH=32) (
input wire [WIDTH-1:0] a,
input wire [WIDTH-1:0] b,
input wire sel,
output wire [WIDTH-1:0] o
);
assign o = (sel==1'b0)? a : b;
endmodule
module tb;
reg [31:0] a,b;
wire [31:0] o;
wire [4:0] r;
reg sel;
initial begin
$dumpfile("dump.vcd"); $dumpvars;
a = 10; b = 20; sel = 1;
end
mux MM(a,b,sel,o);
assign r = o[4:0];
endmodule
如果您仍然收到警告,请告诉我。
我的设计需要多个多路复用器,它们都有两个输入,大多数是 32 位宽。我从设计 32 位 2:1 多路复用器开始。
现在我需要一个 5 位 2:1 多路复用器,我想重新使用我的 32 位设计。连接输入很容易(见下面的代码),但我很难连接输出。
这是我的代码:
reg [4:0] a, b; // Inputs to the multiplexer.
reg select; // Select multiplexer output.
wire [4:0] result; // Output of the multiplexer.
multiplex32_2 mul({27'h0, a}, {27'h0, b}, select, result);
当我通过 iverilog 运行 代码时,我收到一条警告,指出多路复用器需要 32 位输出,但连接的总线只有 5 位宽。模拟显示了预期的结果,但我想去掉警告。
有没有办法告诉 iverilog 忽略多路复用器输出的 27 个未使用位,或者我有 将 32 位宽的总线连接到多路复用器的输出?
我不知道可以在 Verilog 中使用的 #pragma
或类似的东西(类似于 C 中的 #pragma argsused
)。
例如,Xilinx ISE 有一个名为 "message filtering" 的功能,它允许设计人员静音特定的警告消息。你找到它们一次,select它们,选择忽略,后续合成不会触发这些警告。
也许您可以以不需要 "waste" 连接的方式设计您的多路复用器(但实际上并没有浪费,因为合成器将从网表中删除未使用的连接)。一个更优雅的解决方案是使用参数化模块,并以所需的宽度对其进行实例化。像这样:
module mux #(parameter WIDTH=32) (
input wire [WIDTH-1:0] a,
input wire [WIDTH-1:0] b,
input wire sel,
output wire [WIDTH-1:0] o
);
assign o = (sel==1'b0)? a : b;
endmodule
这个模块已经通过这个简单的测试平台进行了测试,它向您展示了如何使用参数实例化一个模块:
module tb;
reg [31:0] a1,b1;
reg sel;
wire [31:0] o1;
reg [4:0] a2,b2;
wire [4:0] o2;
mux #(32) mux32 (a1,b1,sel,o1);
mux #(5) mux5 (a2,b2,sel,o2);
// Best way to instantiate them:
// mux #(.WIDTH(32)) mux32 (.a(a1),.b(b1),.sel(sel),o(o1));
// mux #(.WIDTH(5)) mux5 (.a(a2),.b(b2),.sel(sel),.o(o2));
initial begin
$dumpfile ("dump.vcd");
$dumpvars (1, tb);
a1 = 32'h01234567;
b1 = 32'h89ABCDEF;
a2 = 5'b11111;
b2 = 5'b00000;
repeat (4) begin
sel = 1'b0;
#10;
sel = 1'b1;
#10;
end
end
endmodule
您可以使用此 Eda 游乐场自行测试 link: http://www.edaplayground.com/x/Pkz
我认为问题与仍然是 5 位宽的多路复用器的输出有关。您可以通过执行以下操作来解决它:
reg [4:0] a, b; // Inputs to the multiplexer.
reg select; // Select multiplexer output.
wire [31:0] temp;
wire [4:0] result; // Output of the multiplexer.
multiplex32_2 mul({27'h0, a}, {27'h0, b}, select, temp);
assign result = temp[4:0];
这可以在 http://www.edaplayground.com/ 中使用以下代码轻松测试: (我重新使用了@mcleod_ideafix的代码)
// Code your testbench here
// or browse Examples
module mux #(parameter WIDTH=32) (
input wire [WIDTH-1:0] a,
input wire [WIDTH-1:0] b,
input wire sel,
output wire [WIDTH-1:0] o
);
assign o = (sel==1'b0)? a : b;
endmodule
module tb;
reg [31:0] a,b;
wire [31:0] o;
wire [4:0] r;
reg sel;
initial begin
$dumpfile("dump.vcd"); $dumpvars;
a = 10; b = 20; sel = 1;
end
mux MM(a,b,sel,o);
assign r = o[4:0];
endmodule
如果您仍然收到警告,请告诉我。