0

デザインには複数のマルチプレクサが必要です。それらはすべて 2 つの入力を持ち、ほとんどが 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 ビットしかないという警告が表示されます。シミュレーションは期待どおりの結果を示していますが、警告を取り除きたいです。

マルチプレクサ出力の未使用の 27 ビットを無視するように iverilog に指示する方法はありますか、それとも32 ビット幅のバスをマルチプレクサの出力に接続する必要がありますか?

4

2 に答える 2

4

Verilog で使用できる#pragma(from C に似た) またはそのようなものを知りません。#pragma argsused

たとえば、Xilinx 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

このモジュールは、params を使用してモジュールをインスタンス化する方法を示すこの単純なテスト ベンチでテストされています。

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 に答える