4

Verilog デザインを合成するために、Yosysという非常に優れたツールを試しています。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 出力は、直接 4 つのO信号ビットではありません。代わりに、Yosys は 3 ビット出力を備えた FSM を作成し、FSM の外部に 4 つのO信号ビットを作成するエンコーダを作成しました。

視覚化に関して: 残念ながら、私は KISS2 ファイルを表示するための GUI ツールを知りません (そのようなツールが存在しないという意味ではありません)。.dotただし、KISS2 ファイルからGraphViz ファイルを作成するのは非常に簡単です。たとえば、次の 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 に答える