Yosys:复位时触发器的可变初始值
Yosys: Variable initial value to flip-flop at reset
我正在尝试在重置时为 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 库 ($_DFFSR_PPP_
) 中的内置 FF 之一,忽略了用户定义单元库中的内置 FF。如果我在用户定义的库中包含一个设置重置 (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。 clear
或 preset
中的方程似乎没有被 Yosys 提取。
有什么办法让它起作用吗?我错过了什么吗?
编辑:我正在添加一个完整的示例,以防有人想要 运行 这个。
acc.v
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; }
}
}
acc.tcl
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
Yosys 的 dfflibmap
不支持在 Liberty 文件中清除或预设这样的表达式。
但是,您可以使用带有自定义映射规则的 techmap
命令将 $_DFFSR_PPP_
映射到您自己的触发器 - 类似于我们在 Yosys 中进行 FPGA 技术映射的方式。
举个例子。创建 dffsr_map.v
:
module $_DFFSR_PPP_(input C, S, R, D, output Q);
DFFSR _TECHMAP_REPLACE_ (.CLK(C), .RST(S | R), .I(S), .D(D), .Q(Q));
endmodule
并在dfflibmap
之后添加techmap -map dffsr_map.v -map +/techmap.v
我正在尝试在重置时为 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 库 ($_DFFSR_PPP_
) 中的内置 FF 之一,忽略了用户定义单元库中的内置 FF。如果我在用户定义的库中包含一个设置重置 (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。 clear
或 preset
中的方程似乎没有被 Yosys 提取。
有什么办法让它起作用吗?我错过了什么吗?
编辑:我正在添加一个完整的示例,以防有人想要 运行 这个。
acc.v
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; }
}
}
acc.tcl
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
Yosys 的 dfflibmap
不支持在 Liberty 文件中清除或预设这样的表达式。
但是,您可以使用带有自定义映射规则的 techmap
命令将 $_DFFSR_PPP_
映射到您自己的触发器 - 类似于我们在 Yosys 中进行 FPGA 技术映射的方式。
举个例子。创建 dffsr_map.v
:
module $_DFFSR_PPP_(input C, S, R, D, output Q);
DFFSR _TECHMAP_REPLACE_ (.CLK(C), .RST(S | R), .I(S), .D(D), .Q(Q));
endmodule
并在dfflibmap
techmap -map dffsr_map.v -map +/techmap.v