使用Yosys进行网表验证

时间:2016-01-26 06:44:02

标签: verilog yosys

我想问一下我是否可以在yosys中验证我的设计。我重新合成了我的网表,用yosys来执行(拓扑顺序)。

现在我想通过在网表中插入一些输入并检查输出来检查此设计的验证。

例如,我为我的模型使用了s27基准标记,我想确保我的设计输出与s27基准标记的输出相匹配。我浏览了yosys手册,但我无法知道命令是什么。另外,我使用了其他工具,如Veriwell。但我真的更喜欢使用yosys。

1 个答案:

答案 0 :(得分:2)

如果您想要使用给定的测试平台模拟综合后网表,那么您应该只使用模拟器。 (但是,我强烈推荐Icarus Verilog而不是Veriwell。)

当然,您可以使用形式化的方法来证明Yosys中两个电路的等效性,但这更加复杂,并且在尝试使用更大的设计时需要一定的经验。

以下shell脚本演示了使用yosys对合成后网表进行形式等价检查的两种不同基本方法:

# download fiedler-cooley.v
if [ ! -f fiedler-cooley.v ]; then
    wget https://raw.githubusercontent.com/cliffordwolf/yosys/master/tests/simple/fiedler-cooley.v
fi

# synthesis for ice40
yosys -p 'synth_ice40 -top up3down5 -blif up3down5.blif' fiedler-cooley.v

# formal verification with equiv_*
yosys -l check1.log -p '
    # gold design
    read_verilog fiedler-cooley.v
    prep -top up3down5
    splitnets -ports;;
    design -stash gold

    # gate design
    read_blif up3down5.blif
    techmap -autoproc -map +/ice40/cells_sim.v
    prep -top up3down5
    design -stash gate

    # prove equivalence
    design -copy-from gold -as gold up3down5
    design -copy-from gate -as gate up3down5
    equiv_make gold gate equiv
    hierarchy -top equiv
    equiv_simple
    equiv_status -assert
'

# formal verification with BMC and temproral induction (yosys "sat" command")
yosys -l check2.log -p '
    # gold design
    read_verilog fiedler-cooley.v
    prep -top up3down5
    splitnets -ports;;
    design -stash gold

    # gate design
    read_blif up3down5.blif
    techmap -autoproc -map +/ice40/cells_sim.v
    prep -top up3down5
    design -stash gate

    # prove equivalence
    design -copy-from gold -as gold up3down5
    design -copy-from gate -as gate up3down5
    miter -equiv -flatten gold gate miter
    hierarchy -top miter
    sat -verify -tempinduct -prove trigger 0 -seq 1 -set-at 1 in_up,in_down 0
'

# formal verification with BMC+tempinduct using undef modeling
yosys -l check3.log -p '
        # gold design
        read_verilog fiedler-cooley.v
        prep -top up3down5
        splitnets -ports;;
        design -stash gold

        # gate design
        read_blif up3down5.blif
        techmap -autoproc -map +/ice40/cells_sim.v
        prep -top up3down5
        design -stash gate

        # prove equivalence
        design -copy-from gold -as gold up3down5
        design -copy-from gate -as gate up3down5
        miter -equiv -flatten -ignore_gold_x gold gate miter
        hierarchy -top miter
        sat -verify -tempinduct -prove trigger 0 -set-init-undef -set-def-inputs
'

每种形式等价检查方法都有其优点和缺点。

例如,上面的第一种方法需要能够按名称匹配足够数量的内部连线,以便成功验证等效性。但它能够将较大的电路分解为较小的电路,因此即使是较大的设计也能很好地工作。

第二种方法不需要按名称匹配任何内部线路,但需要电路的复位条件(-seq 1 -set-at 1 in_up,in_down 0部分),并且仅适用于“泄漏”的电路。无论输入信号的顺序如何,所有内部状态都在少量周期内输出。

第三种方法是第二种方法的变体,它使用undef状态的建模来避免复位条件的要求,但产生更复杂的SAT模型,因此计算效率可能更低。

所有人都说,你不应该依靠一个工具来检查输出本身产生了什么。例如。如果Yosys Verilog前端有错误,那么这将同样影响合成和验证,并且永远不会检测到问题。因此,如果您使用Yosys来验证Yosys'输出然后除了使用独立代码库的验证方案之外,您应该只这样做。例如,Icarus Verilog或Verilator将是两个不与Yosys共享任何代码的模拟器(或彼此之后)。另外:一般来说,形式验证不能代替模拟。 (特别是不是形式上的等价检查:你怎么知道你检查等效的模型首先是正确的?)