Подключите 5-битную шину к 32-битной выходной шине.

В моем проекте требуется несколько мультиплексоров, все они имеют два входа, и большинство из них имеют разрядность 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-битной шиной?


person lkamp    schedule 22.09.2015    source источник


Ответы (2)


Я не знаю #pragma или что-то подобное (похожее на #pragma argsused из C), которое можно использовать в Verilog.

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

Этот модуль был протестирован с помощью этого простого тестового стенда, который показывает вам, как создать экземпляр модуля с параметрами:

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< /а>

person mcleod_ideafix    schedule 22.09.2015
comment
Спасибо. Я не думаю, что заглушение предупреждений было бы решением, особенно для меня, поскольку я новичок в Verilog и не хочу с самого начала приобретать вредные привычки. Параметризованные модули выглядят так, как будто они решают мою проблему, я попробую ваше решение! - person lkamp; 23.09.2015

Я думаю, что проблема связана с выходом мультиплексора, который по-прежнему имеет ширину 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

Дайте мне знать, если вы все еще получаете предупреждение.

person Abhishek Das    schedule 02.10.2015