4

我正在尝试这个名为Yosys的非常简洁的工具来合成我的 Verilog 设计。我想使用 Yosys 命令 fsm_export 在我的 Verilog 设计中导出 FSM,但它不会生成任何东西。我想知道这个命令应该如何调用?

我调用的一系列命令是:read_verilog qwerty.v ; fsm_export

如果生成成功并且我有 KISS2 格式的 FSM,那么任何人都知道有哪些(开源)工具可以让我可视化 FSM?

非常感谢!

4

1 回答 1

8

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

达到这种状态的最简单方法是简单地运行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文件。(我刚刚修复了 fsm_detect中的一个错误,所以请使用当前的 git head。)

.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信号位。

关于可视化:不幸的是,我不知道任何用于显示 KISS2 文件的 GUI 工具(这并不意味着不存在这样的工具)。但是从 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

这将显示以下图表:

xdot 输出

于 2015-09-18T09:10:30.333 回答