2016-02-10 1 views
0

Так что я пытаюсь написать простой 2-1 мукс в Verilog с помощью логических ворот, и я не уверен, что я делаю неправильно. Код для мультиплексоров заключается в следующем:Структурный 2-1 мук не работает во время разработки

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 

модуль компилируется нормально, но когда я развиваю свой испытательный стенд я получаю несколько ошибок (по одному для каждого строба), которые принимают форму

ворота (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 
+3

'and # 8 and1 [31: 0] ...' – toolic

+0

Ну, это кажется очевидным в ретроспективе. Последующий вопрос, есть ли хорошая ссылка Verilog, которую я мог бы найти для ответа? –

+1

Чтобы ответить на этот вопрос, я взглянул на источник, бесплатный IEEE Std 1800-2012, раздел 28. Моделирование уровня ворот и коммутатора. – toolic

ответ

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>).

Так что, если вы экземпляр модуля х, с SIZE = 6, то вы должны написать, как показано ниже:

x x1 #(6) (a, b); // Here SIZE = 6, and so 1[5:0], b[5:0] 

Надеюсь, вы поняли разницу.