我试图在重置时为 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;
}
}
}
我试图合成到这个 FF 的部分 Verilog 代码是
always@(posedge clk or posedge rst)
if(rst) begin
e_reg <= e_input;
end
else begin
e_reg <= e_shift;
end
但是,当我运行综合时,它使用来自 Yosys 库 ( ) 的内置 FF$_DFFSR_PPP_
之一,而忽略了用户定义单元库中的一个。如果我在用户定义的库中包含一个 set-reset (SR) FF,如下所示,由 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。似乎 Yosys 中的方程clear
或preset
没有被拾取。
有什么办法让它工作吗?我错过了什么吗?
编辑:我正在添加一个完整的示例,以防有人想要运行它。
加速器
module acc #(parameter N = 1)(
input clk,
input rst,
input [N-1:0] a,
input [N-1:0] b,
output [N-1:0] o
);
logic [N-1:0] o_reg;
assign o = o_reg & a;
always@(posedge clk or posedge rst) begin
if(rst) o_reg <= b;
else o_reg <= o;
end
endmodule
asic_cell_yosys.lib
library(demo) {
cell(IV) {
area: 1;
pin(A) { direction: input; }
pin(Z) { direction: output; function: "A'"; }
}
cell(AND) {
area: 1;
pin(A) { direction: input; }
pin(B) { direction: input; }
pin(Z) { direction: output; function: "(A&B)"; }
}
cell(NAND) {
area: 1;
pin(A) { direction: input; }
pin(B) { direction: input; }
pin(Z) { direction: output; function: "(A&B)'"; }
}
cell(DFFSR) {
area: 4;
ff("IQ", "IQN"){clocked_on: C;
next_state: D;
preset: S;
clear: R; }
pin(C) { direction: input;
clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output;
function: "IQ"; }
pin(S) { direction: input; }
pin(R) { direction: input; }
}
}
会计文件
yosys -import
read_verilog -sv acc.sv
hierarchy -check -top acc
procs; opt; flatten; opt;
techmap; opt;
dfflibmap -liberty asic_cell_yosys.lib
abc -liberty asic_cell_yosys.lib -script +map;
opt; clean; opt;
opt_clean -purge
write_verilog -noattr -noexpr -nohex acc_syn.v