使用 Yosys 导出 FSM
FSM export using Yosys
我正在试用这个名为 Yosys 的非常简洁的工具来综合我的 Verilog 设计。我想使用 Yosys 命令 fsm_export 在我的 Verilog 设计中导出 FSM,但它不会生成任何东西。我想知道应该如何调用这个命令?
我调用的一系列命令是:read_verilog qwerty.v ; fsm_export
如果生成成功并且我有 KISS2 格式的 FSM,谁知道有什么(开源)工具可以让我可视化 FSM?
非常感谢!
fsm_export
命令对提取的 FSM(即 $fsm
单元)进行操作。为了创建设计包含此类 FSM 单元的状态,您首先需要检测 FSM (fsm_dectect
),然后提取它们 (fsm_extract
)。有关 FSM 流程的更多信息,请参阅 help fsm
。
达到这种状态的最简单方法就是 运行 fsm -nomap
。示例脚本:
read_verilog test.v
proc; opt; fsm -nomap
fsm_export -o test.kiss2
例如考虑以下 test.v
文件。
module test(input clk, rst, ctrl, output [3:0] O);
reg [1:0] state;
always @(posedge clk) begin
O <= 0;
if (rst) begin
state <= 0;
end else case (state)
0: begin
state <= ctrl ? 1 : 2;
O <= 1;
end
1: begin
O <= 2;
if (ctrl) begin
state <= 2;
O <= 3;
end
end
2: begin
O <= 4;
if (ctrl) begin
state <= 3;
O <= 5;
end
end
3: begin
if (!ctrl)
state <= 2'b00;
end
endcase
end
endmodule
上面的脚本将生成以下 test.kiss2
文件。 (我有 just fixed a bug in fsm_detect,所以使用当前的 git 头。)
.i 2
.o 3
.p 12
.s 4
.r s0
-1 s0 s0 100
00 s0 s1 100
10 s0 s2 100
-1 s1 s0 001
00 s1 s1 001
10 s1 s3 001
-1 s2 s0 010
10 s2 s1 010
00 s2 s2 010
00 s3 s0 000
-1 s3 s0 000
10 s3 s3 000
注意:本例中的 FSM 输出不直接是四个 O
信号位。相反,Yosys 创建了一个具有三位输出的 FSM 和一个 FSM 外部的编码器,用于创建四个 O
信号位。
关于可视化:不幸的是,我不知道有任何 GUI 工具可以显示 KISS2 文件(这并不意味着不存在这样的工具)。但是从 KISS2 文件创建 GraphViz .dot
文件非常容易,例如使用以下 python 脚本 (kiss2dot.py
).
#!/usr/bin/env python3
import fileinput
print("digraph fsm {")
for line in fileinput.input():
if not line.startswith("."):
in_bits, from_state, to_state, out_bits = line.split()
print("%s -> %s [label=\"IN=%s,\nOUT=%s\"];" % (from_state, to_state,
in_bits.replace("-", "?"), out_bits.replace("-", "?")))
print("}")
用法示例:
python3 kiss2dot.py test.kiss2 > test.dot
xdot test.dot
这将显示下图:
我正在试用这个名为 Yosys 的非常简洁的工具来综合我的 Verilog 设计。我想使用 Yosys 命令 fsm_export 在我的 Verilog 设计中导出 FSM,但它不会生成任何东西。我想知道应该如何调用这个命令?
我调用的一系列命令是:read_verilog qwerty.v ; fsm_export
如果生成成功并且我有 KISS2 格式的 FSM,谁知道有什么(开源)工具可以让我可视化 FSM?
非常感谢!
fsm_export
命令对提取的 FSM(即 $fsm
单元)进行操作。为了创建设计包含此类 FSM 单元的状态,您首先需要检测 FSM (fsm_dectect
),然后提取它们 (fsm_extract
)。有关 FSM 流程的更多信息,请参阅 help fsm
。
达到这种状态的最简单方法就是 运行 fsm -nomap
。示例脚本:
read_verilog test.v
proc; opt; fsm -nomap
fsm_export -o test.kiss2
例如考虑以下 test.v
文件。
module test(input clk, rst, ctrl, output [3:0] O);
reg [1:0] state;
always @(posedge clk) begin
O <= 0;
if (rst) begin
state <= 0;
end else case (state)
0: begin
state <= ctrl ? 1 : 2;
O <= 1;
end
1: begin
O <= 2;
if (ctrl) begin
state <= 2;
O <= 3;
end
end
2: begin
O <= 4;
if (ctrl) begin
state <= 3;
O <= 5;
end
end
3: begin
if (!ctrl)
state <= 2'b00;
end
endcase
end
endmodule
上面的脚本将生成以下 test.kiss2
文件。 (我有 just fixed a bug in fsm_detect,所以使用当前的 git 头。)
.i 2
.o 3
.p 12
.s 4
.r s0
-1 s0 s0 100
00 s0 s1 100
10 s0 s2 100
-1 s1 s0 001
00 s1 s1 001
10 s1 s3 001
-1 s2 s0 010
10 s2 s1 010
00 s2 s2 010
00 s3 s0 000
-1 s3 s0 000
10 s3 s3 000
注意:本例中的 FSM 输出不直接是四个 O
信号位。相反,Yosys 创建了一个具有三位输出的 FSM 和一个 FSM 外部的编码器,用于创建四个 O
信号位。
关于可视化:不幸的是,我不知道有任何 GUI 工具可以显示 KISS2 文件(这并不意味着不存在这样的工具)。但是从 KISS2 文件创建 GraphViz .dot
文件非常容易,例如使用以下 python 脚本 (kiss2dot.py
).
#!/usr/bin/env python3
import fileinput
print("digraph fsm {")
for line in fileinput.input():
if not line.startswith("."):
in_bits, from_state, to_state, out_bits = line.split()
print("%s -> %s [label=\"IN=%s,\nOUT=%s\"];" % (from_state, to_state,
in_bits.replace("-", "?"), out_bits.replace("-", "?")))
print("}")
用法示例:
python3 kiss2dot.py test.kiss2 > test.dot
xdot test.dot
这将显示下图: