前言
yosysjs 是一款基于 JavaScript 的处理 RTL(Register Transfer Level)数字电路的开源工具包。它的核心代码是 yosys,一个在本地机器上运行的基于命令行的开源 RTL 合成器。yosysjs 借助了 yosys 的能力,使得在前端浏览器中对 RTL 代码进行语法分析、转换、优化和仿真变得更加容易和高效。
本文将介绍 yosysjs 的基本用法、常见 API 和示例,帮助你了解如何使用 yosysjs 来处理 RTL 数字电路。
安装
yosysjs 可以通过 npm 安装。在终端输入以下命令即可:
$ npm install yosysjs
核心 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