Verilog 使用Yosys导出FSM

Verilog 使用Yosys导出FSM,verilog,fsm,yosys,Verilog,Fsm,Yosys,我正在尝试这个相当简洁的工具,叫做综合我的Verilog设计。我想使用Yosys命令FSM_export导出Verilog设计中的FSM,但它不生成任何内容。我想知道这个命令怎么叫 我调用的一系列命令是:read\u verilog qwerty.v;fsm_导出 如果生成成功并且我有KISS2格式的FSM,有人知道有什么(开源)工具可以让我可视化FSM吗 非常感谢 fsm_export命令对提取的fsm(即$fsm单元格)进行操作。为了在设计中创建包含此类FSM单元的状态,首先需要检测FSM(

我正在尝试这个相当简洁的工具,叫做综合我的Verilog设计。我想使用Yosys命令FSM_export导出Verilog设计中的FSM,但它不生成任何内容。我想知道这个命令怎么叫

我调用的一系列命令是:
read\u verilog qwerty.v;fsm_导出

如果生成成功并且我有KISS2格式的FSM,有人知道有什么(开源)工具可以让我可视化FSM吗


非常感谢

fsm_export命令对提取的fsm(即
$fsm
单元格)进行操作。为了在设计中创建包含此类FSM单元的状态,首先需要检测FSM(
FSM_detect
),然后提取它们(
FSM_extract
)。有关fsm流程的更多信息,请参阅
帮助fsm

要达到这种状态,最简单的方法就是运行
fsm-nomap
。示例脚本:

read_verilog test.v
proc; opt; fsm -nomap
fsm_export -o test.kiss2

例如,考虑下面的<代码>测试.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
注:在这种情况下,FSM输出不直接是四个
O
信号位。相反,Yosys创建了一个具有三位输出的FSM和FSM外部的编码器,用于创建四个
O
信号位

关于可视化:不幸的是,我不知道有任何GUI工具可以显示KISS2文件(这并不意味着没有这样的工具存在)。但是从KISS2文件创建GraphViz
.dot
文件非常容易,例如使用以下python脚本(
kiss2dot.py

用法示例:

python3 kiss2dot.py test.kiss2 > test.dot
xdot test.dot
这将显示以下图形:


如果您只想将FSM看作一个图表,我知道Altera QuartusII(FPGA合成工具)能够为FSM生成STD。这个网页是免费的,可以做到这一点,尽管它不适用于更复杂的FSM,我也不知道你到底需要什么。至于Yosys和KISS2,我不确定你能找到什么,因为它们在RTL/FSM级设计已经有限的空间中似乎并不流行:(
#!/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