#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];