npm 包 yosysjs 使用教程

阅读时长 14 分钟读完

前言

yosysjs 是一款基于 JavaScript 的处理 RTL(Register Transfer Level)数字电路的开源工具包。它的核心代码是 yosys,一个在本地机器上运行的基于命令行的开源 RTL 合成器。yosysjs 借助了 yosys 的能力,使得在前端浏览器中对 RTL 代码进行语法分析、转换、优化和仿真变得更加容易和高效。

本文将介绍 yosysjs 的基本用法、常见 API 和示例,帮助你了解如何使用 yosysjs 来处理 RTL 数字电路。

安装

yosysjs 可以通过 npm 安装。在终端输入以下命令即可:

核心 API

yosysjs 的 API 包含 yosysjs(RTL 电路实例)、addLibrary(向实例中添加库文件)、runPass(运行 pass 转换) 和 exportVerilog(导出 Verilog) 等方法。

yosysjs(RTL 电路实例)

用于初始化一个 RTL 电路实例,例子:

-- -------------------- ---- -------
----- ------- - -------------------

----- --- - -
------ ------------- ---- ----- --- ------ -----
---- ------ -----
------- --------- ---- -----
------ -- ---
----
------- --- - ---- - --
---------
--

----- ---- - -------------

addLibrary(向实例中添加库文件)

用于向 RTL 电路实例中添加库文件,例子:

-- -------------------- ---- -------
----- ------- - -------------------

----- --- - -
------ ------------- ---- ----- --- ------ -----
-------------------------------  -- -------
---------
--

----- ---- - ----------------------------------------------

runPass(运行 pass 转换)

yosysjs 可以通过运行各种 pass 来对 RTL 代码进行转换和优化。runPass() 方法用于运行指定的 pass 转换。例如,下面的例子中,我们使用 "synth_ice40" pass 将 RTL 代码转换为 ice40 FPGA 上的 Verilog 代码:

-- -------------------- ---- -------
----- ------- - -------------------

----- --- - -
------ ------------- ---- ----- --- ------ -----
---- ------ -----
------- --------- ---- -----
------ -- ---
----
------- --- - ---- - --
---------
--

----- ---- - ----------------------------------------------------

exportVerilog(导出 Verilog)

将处理后的 RTL 代码导出成 Verilog 代码。例子:

-- -------------------- ---- -------
----- ------- - -------------------

----- --- - -
------ ------------- ---- ----- --- ------ -----
---- ------ -----
------- --------- ---- -----
------ -- ---
----
------- --- - ---- - --
---------
--

----- ---- - ------------- ----------------

示例

下面给出一个包含多个模块互相调用的 RTL 代码示例,以测试 yosysjs 的 API。

-- -------------------- ---- -------
-----------------
--    ---    ----
-----------------
------ --- -                ------ ---
    ----- ----
    ----- ------
    ----- ----- --------
    ------ ----- --------
--
    ---- ----- ----- ------- ------- -------

    --- ----- ---------           -- ---- ---
    --- ------- ---------         -- ---- ---
    --- --------- -------- ---------  ------ ---
    -- --------- -------- ---------  -- ---- --

    ------- --------- -----------      -- ---- -------
    ------- --------- -----------      -- ---- -------
    ------- --------- -----------      -- ---- -------

    -------- ----------- ---- ------ -----------  -- ---- --------
    -------- ----------- ---- ------ -----------  -- ---- --------
    -------- ----------- ---- ------ -----------  -- ---- --------

    -- ----------- ---------- ---------- ----------  -- ---- --
---------

------ --- ------ -- ------ ---  -- ---
    ------ - - - --
---------

------ --- ------ -- ------ ---  -- ---
    ------ - - --
---------

------ --- ------ -- ----- -- ------ ---  -- --
    ------ - - - - --
---------

------ -- ------ ----- -- ------ ---  -- --
    ------ - - - --
---------

------ ------- ------ -- ------ ---  -- ---
    -- --- ----- ---
---------

------ ------- ------ -- ------ ---  -- ---
    --- - - --
    ------ --------- -- - -- - --
    ------ - - --
---------

------ ------- ------ -- ------ ---  -- ---
    ------ - - - --- - ------  -- ----
---------

------ -------------- -- ----- ---- ----- ------ ------ ---  -- ---------
    ------ --------- ---- ------- ------ -----
        -- -------
            - -- -----
        ----
            - -- --
    ---
---------

用 yosysjs 对 RTL 代码进行 Verilog 文件的生成:

-- -------------------- ---- -------
----- ------- - -------------------

----- --- - -
-------------------------
 - --- ---- ---- -----
 -------------------------
--- ------------ --- ------- ---- ----- ---

------ --- -                ------ ---
    ----- ----
    ----- ------
    ----- ----- --------
    ------ ----- --------
--
    ---- ----- ----- ------- ------- -------

    --- ----- ---------           -- ---- ---
    --- ------- ---------         -- ---- ---
    --- --------- -------- ---------  ------ ---
    -- --------- -------- ---------  -- ---- --

    ------- --------- -----------      -- ---- -------
    ------- --------- -----------      -- ---- -------
    ------- --------- -----------      -- ---- -------

    -------- ----------- ---- ------ -----------  -- ---- --------
    -------- ----------- ---- ------ -----------  -- ---- --------
    -------- ----------- ---- ------ -----------  -- ---- --------

    -- ----------- ---------- ---------- ----------  -- ---- --
---------

------ --- ------ -- ------ ---  -- ---
    ------ - - - --
---------

------ --- ------ -- ------ ---  -- ---
    ------ - - --
---------

------ --- ------ -- ----- -- ------ ---  -- --
    ------ - - - - --
---------

------ -- ------ ----- -- ------ ---  -- --
    ------ - - - --
---------

------ ------- ------ -- ------ ---  -- ---
    -- --- ----- ---
---------

------ ------- ------ -- ------ ---  -- ---
    --- - - --
    ------ --------- -- - -- - --
    ------ - - --
---------

------ ------- ------ -- ------ ---  -- ---
    ------ - - - --- - ------  -- ----
---------

------ -------------- -- ----- ---- ----- ------ ------ ---  -- ---------
    ------ --------- ---- ------- ------ -----
        -- -------
            - -- -----
        ----
            - -- --
    ---
---------
--

----- ---- - -----------------------------

------------------

输出的 Verilog 文件如下:

-- -------------------- ---- -------
--------------------------
-- ------------- -- -----
-- ----- -- ------------- ------ -- ------- ----- -- ------ -- -----
--------------------------
------ --- -
  ----- ----
  ----- ------
  ----- ----- --------
  ------ ----- --------
--
  ---- ----- -----
  ---- -------
  ---- -------
  ---- -------
  ---- ----- -------
  ---- ----- -------
  ---- ----- -------
  ---- ----- --------
  ---- ----- --------
  ---- ----- --------
  ---- ----- --------
  ---- --------
  ---- --------

  ----- --
    --------------------
    ----------
  - ------ -
    --------
    -----------
  --

  ------- --
    ------------------------
    ----------
  - ------ -
    ----------
    -----------
    -----------
  --

  ---- ------ -
    -------------
    -------------
    -----------
  --

  ---- --
    ----------------
  - ------ -
    ----------------
    ----------------
    ----------------
    ----------------
    -----------
  --

  ---- --
    ----------------
  - ------- -
    -------------
    ----------
    ----------
  --

  ------- ------- -
    --------------
    ----------
    ---- -----------
    -------------
  --

  ---- --
    ----------------
  - ------- -
    -------------
    ----------
    ----------
    ----------
  --

  ---- --
    ----------------
  - ------- -
    -------------
    ----------
  --

  ---- --
    ----------------
  - ------- -
    -------------
    ----------
    ----------
    -----------
  --

  ----- --
    --------------------
    ----------
  - ------- -
    ------------
    -----------
  --

  ---- --
    ----------------
  - ------- -
    ---------------
    ---------------
    ---------------
    ----------
    -----------
  --

  ---- --
    ----------------
  - ------- -
    ---------------
    ---------------
    -----------
  --

  ------ ------- -
    --------
    -----------
    -----------
    -------------
  --

  ------ ------- -
    --------
    -----------
    -----------
    -------------
  --

  ------ ------- -
    --------
    -----------
    -----------
    -------------
  --

  ---- --
    ----------------
  - ------- -
    ---------------
    ---------------
    ---------------
    -----------
  --

  ------ ------- -
    --------
    -----------
    ------------
    -----------
  --

  ------ ------------- - - -------- -------- -------- ------- --

---------

结论

yosysjs 是一款强大且易于使用的前端工具,它能够让开发者更加轻松地处理和优化 RTL 代码。你可以使用本文中提到的 API 和示例来开始使用 yosysjs,并根据自己的需求扩展更多的功能。

有了 yosysjs,前端开发者可以在本地机器上进行 RTL 电路的语法分析、转换和仿真,这将极大地提高开发效率和代码质量,同时让开发者们更加专注于其他方面的工作。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60057c4681e8991b448ebcaa

纠错
反馈