0

我的设计需要多个多路复用器,它们都有两个输入,大多数都是 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位宽的总线连接到多路复用器的输出?

4

2 回答 2

4

我不知道可以在 Verilog 中使用的#pragma或类似的东西(类似于C 语言)。#pragma argsused

例如,赛灵思 ISE 有一个称为“消息过滤”的功能,它允许设计人员静音特定的警告消息。你找到它们一次,选择它们,选择忽略,随后的合成不会触发那些警告。

也许您可以以不需要“浪费”连接的方式设计多路复用器(尽管实际上并未浪费,因为合成器将从网表中删除未使用的连接)。更优雅的解决方案是使用参数化模块,并以所需的宽度对其进行实例化。像这样的东西:

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 Playground 链接自行测试: http ://www.edaplayground.com/x/Pkz

于 2015-09-22T22:42:06.497 回答
0

我认为问题与仍为 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

如果您仍然收到警告,请告诉我。

于 2015-10-02T20:26:04.623 回答