【问题标题】:How does the Yosys ConstEval API work?Yosys ConstEval API 是如何工作的?
【发布时间】:2015-08-19 18:56:09
【问题描述】:

我正在尝试编写一个需要评估组合电路的插件。据我所知,ConstEval 是执行此操作的工具。但是,API 对我来说不是很清楚。有没有关于 ConstEval 成员的简要介绍以及他们的工作?

(Asked by jeremysalwen on github).

【问题讨论】:

    标签: yosys


    【解决方案1】:

    使用 ConstEval 类实际上非常简单。您为给定模块创建一个 ConstEval 对象并使用void ConstEval::set(SigSpec, Const) 方法设置已知值。在设置所有已知信号后,bool ConstEval::eval(SigSpec&, SigSpec&) 方法可用于评估网络。 eval() 方法在评估成功时返回 true,并将第一个参数中的网络替换为网络评估为的常量值。否则返回 false 并将第二个参数设置为需要设置的网络列表以继续评估。

    push()pop() 方法可用于为set() 创建本地上下文。方法stop() 可用于声明评估应停止的信号,即使存在驱动网络的组合单元。

    以下简单的 Yosys 插件演示了如何使用 ConstEval API (evaldemo.cc):

    #include "kernel/yosys.h"
    #include "kernel/consteval.h"
    
    USING_YOSYS_NAMESPACE
    PRIVATE_NAMESPACE_BEGIN
    
    struct EvalDemoPass : public Pass
    {
        EvalDemoPass() : Pass("evaldemo") { }
    
        virtual void execute(vector<string>, Design *design)
        {
            Module *module = design->top_module();
    
            if (module == nullptr)
                log_error("No top module found!\n");
    
            Wire *wire_a = module->wire("\\A");
            Wire *wire_y = module->wire("\\Y");
    
            if (wire_a == nullptr)
                log_error("No wire A found!\n");
    
            if (wire_y == nullptr)
                log_error("No wire Y found!\n");
    
            ConstEval ce(module);
            for (int v = 0; v < 4; v++) {
                ce.push();
                ce.set(wire_a, Const(v, GetSize(wire_a)));
                SigSpec sig_y = wire_y, sig_undef;
                if (ce.eval(sig_y, sig_undef))
                    log("Eval results for A=%d: Y=%s\n", v, log_signal(sig_y));
                else
                    log("Eval failed for A=%d: Missing value for %s\n", v, log_signal(sig_undef));
                ce.pop();
            }
        }
    } EvalDemoPass;
    
    PRIVATE_NAMESPACE_END
    

    示例用法:

    $ cat > evaldemo.v <<EOT
    module main(input [1:0] A, input [7:0] B, C, D, output [7:0] Y);
      assign Y = A == 0 ? B : A == 1 ? C : A == 2 ? D : 42;
    endmodule
    EOT
    
    $ yosys-config --build evaldemo.so evaldemo.cc
    $ yosys -m evaldemo.so -p evaldemo evaldemo.v
    ...
    -- Running command `evaldemo' --
    Eval failed for A=0: Missing value for \B
    Eval failed for A=1: Missing value for \C
    Eval failed for A=2: Missing value for \D
    Eval results for A=3: Y=8'00101010
    

    【讨论】:

    • 推送/弹出是否创建独立的上下文,或者上下文是否累积在堆栈上的所有内容上?
    • 是的,它对堆栈上的所有内容都是累积的:分配一直保持活动状态,直到它创建的上下文被弹出。
    猜你喜欢
    • 1970-01-01
    • 2014-06-19
    • 2019-04-20
    • 2015-06-01
    • 1970-01-01
    • 2018-04-12
    • 2012-06-01
    • 2021-01-01
    • 2012-02-12
    相关资源
    最近更新 更多