Как будут синтезированы инструкции assign?

#verilog #system-verilog #synthesis

#verilog #система-verilog #синтез

Вопрос:

Мне интересно знать, для чего будут синтезироваться эти строки? Я разрабатываю кэш с прямым отображением и использую assign для разделения моих битов индекса, смещения и тега. Будет ли это синтезировано в демультиплексор? Я не упоминал весь код, поскольку я просто хочу знать, как будут выглядеть инструкции assign после синтеза. В программировании 8085 я прочитал термин как «демультиплексирование адреса», поэтому это сбивало с толку.

 module cache 
        (   input bit clk,
            input bit rst,
            input logic [15:0] address,
            input logic valid_in,
            input logic compare,
            input logic wr,
            input logic enable,
            input logic write_through,
            output logic dirty,
            output logic [4:0] tag_out,
            output logic [15:0] data_out,
            output logic valid_out,
            output hit
        );

            logic [7:0] index;
            logic [1:0] offset;
            logic [4:0] tag_in;

            assign offset = address[1:0];
            assign index  = address[9:2];
            assign tag_in = address[15:10];

    endmodule
  

Ответ №1:

Приведенный выше код будет просто синтезирован как wire, поскольку есть только присваивания. Я не уверен, какую логику демультиплексирования вы пытаетесь создать, но обычно для демультиплексора вам нужно иметь сигнал select, на основе которого вы декодируете, какой вывод должен быть включен.

Ниже приведен пример для логики демультиплексора 1:2

 module demux_1_2(
   input [3:0] Q, 
   input Sel,
   output reg [3:0] D1, 
   output reg [3:0] D2
   );

always@(*) 
begin
   if(~Sel) begin 
      D1 = Q;
      D2 = 0; 
   end else begin 
      D1 = 0; 
      D2 = Q; 
   end
end

endmodule
  

Комментарии:

1. Итак, мой вопрос здесь заключается в том, какую логику будет использовать аппаратное обеспечение для разделения разных битов адресного сигнала?

2. @ShankhadeepMukerji Программному обеспечению не нужно использовать какую-либо логику, поскольку в вашем коде ее нет. Это похоже на соединение двух проводов.

3. будет ли использование always_comb также выводить то же самое, что и assign?

4. ДА. always_comb begin D1 = ~sel ? Q : 0; D2 = sel ? Q : 0; end

Ответ №2:

Поскольку в RHS assign нет логических или арифметических операторов, эти инструкции просто становятся ссылками с удобными именами для выбора части address входных данных. Это то же самое, что происходит, когда вы создаете экземпляр модуля и подключаетесь к его портам — сигналы могут проходить через изменение имени. На самом деле, вы могли бы вы могли бы написать свое address объявление входного порта как

 input .address({tag_in,index,offset}),
  

Вы по-прежнему подключаете address порт при создании экземпляра этого модуля, но внутри модуля для ссылки доступны только tag_in, индекс и смещение, а не адрес.

В SystemVerilog есть alias конструкция, делающая более очевидным, что вы просто создаете удобные имена для сигнала, вместо объявления другого набора сигналов и использования assign инструкции.

  alias offset = address[1:0];
 alias index  = address[9:2];
 alias tag_in = address[15:10];