Yosys: начальное значение переменной для триггера при перезагрузке
Я пытаюсь присвоить начальное значение FF при сбросе. Начальное значение является входом в схему. В библиотеке я добавил следующие FF:
cell (DFF){
area : 0;
ff(IQ,IQN){
next_state : "D";
clocked_on : "CLK";
clear : "I'*RST";
preset : "I*RST";
clear_preset_var1 : L;
}
pin(CLK){
direction : input;
capacitance : 0;
clock : true;
}
pin(RST){
direction : input;
capacitance : 0;
}
pin(D){
direction : input;
capacitance : 0;
timing() {
related_pin : "CLK";
}
}
pin(I){
direction : input;
capacitance : 0;
}
pin(Q){
direction : output;
function : "IQ";
timing() {
related_pin : "CLK";
timing_type : falling_edge;
}
timing() {
related_pin : "RST";
timing_type : clear;
timing_sense : positive_unate;
}
timing() {
related_pin : "I";
timing_type : clear;
timing_sense : negative_unate;
}
timing() {
related_pin : "RST";
timing_type : preset;
timing_sense : positive_unate;
}
timing() {
related_pin : "I";
timing_type : preset;
timing_sense : positive_unate;
}
}
}
Часть кода Verilog, которую я пытаюсь синтезировать в этот FF,
always@(posedge clk or posedge rst)
if(rst) begin
e_reg <= e_input;
end
else begin
e_reg <= e_shift;
end
Однако, когда я запускаю синтез, он использует одну из встроенных FF из библиотеки Yosys ($_DFFSR_PPP_
) игнорировать один из пользовательской библиотеки ячеек. Если я включу один из FF набора-сброса (SR) в пользовательскую библиотеку, как показано ниже, то, что подхватывает Yosys.
cell(DFF) {
area: 0;
ff("IQ", "IQN") { clocked_on: CLK;
next_state: D;
preset: I;
clear: RST; }
pin(CLK) { direction: input;
clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output;
function: "IQ"; }
pin(I) { direction: input; }
pin(RST) { direction: input; }
}
Предыдущий работает с Synopsys DC, но не с Yosys. Кажется, что уравнения в clear
или же preset
не были подхвачены Yosys.
Есть ли способ заставить это работать? Я что-то пропустил?
1 ответ
Yosys' dfflibmap
не поддерживает выражения, такие как это, для очистки или предустановки в файле Liberty.
Тем не менее, вы можете использовать techmap
команда с пользовательским правилом сопоставления для сопоставления $_DFFSR_PPP_
на свой собственный триггер - аналогично тому, как мы делаем техкарту FPGA в Yosys.