ysyx:接入nvboard
ysyx的nvboard项目里自带了一个example,用来演示功能,同时也给出了简单的使用说明。
要将自己的verilog代码接入nvboard,首先需要生成一份nvboard.a库文件。在nvboard目录下make nvboardarchive,然后将库文件放到npc文件夹下的目录文件。库文件位于nvboard的build文件夹。
假设我们的c++文件只有main.cpp,元件代码只有top.v。为了接入nvboard,我们可以直接参考example的makefile文件,直接cp make run部分的代码。本来其实是可以自己写一个makefile代码的,但是由于有bug,所以就保留了原样。
1. 原本的记录波形的相关cpp激励代码可以不用改动,在cpp代码的对应位置,按照readme的说明,加入nvboard的函数即可:
nvboard_bind_all_pins(&dut); nvboard_init(); while (1) { // ... nvboard_update(); } nvboard_quit();
static void single_cycle() { dut.clk = 0; dut.eval(); dut.clk = 1; dut.eval(); } static void reset(int n) { dut.rst = 1; while (n -- > 0) single_cycle(); dut.rst = 0; } int main() { nvboard_bind_all_pins(&dut); nvboard_init(); reset(10); while(1) { nvboard_update(); single_cycle(); } }
3. 编译需要包含的主要文件是csrc下的文件(main.cpp)和用于引脚绑定的auto_bind.cpp,以及vsrc下的所有verilog元件。
4. constr文件夹下的top.nxdc文件就是将verilog代码的信号和nvboard的引脚绑定。 每行一组,可以绑定单个输入输出信号,也可以直接一个向量绑定一组引脚(每个引脚都要写明,从高到低)。
比如说:我在top.v顶层模块里声明了一组8位向量[7:0] y,用来对应7号到0号led灯,那我在top.nxdc文件里就可以单开一行,写:
y (LD7,LD6,LD5,LD4,LD3,LD2,LD1,LD0)
这个文件是必须要有的,要不然不能自动生成bind_all.cpp。当然,手动一个个调用函数、自己写makefile的话,这部分就可以无视。
5. nvboard文件夹下的N4可以查看nvboard所有可用的引脚以及对应的名字,比如左下角的led灯泡序列对应名字就叫LD。 虚拟板子的引脚和top元件的输入输出方向应该保持一致。此外,top.nxdc文件里,绑定到板子的元件输入输出信号,必须都在verilog顶层模块里直接声明,子模块里声明无效。
反之,.v元件代码里的输入输出信号可以不绑定板子引脚,选择空置或者由c++代码管理,比如样例里面的rst和clk信号,就是通过代码赋值的。按照nvboard的说明,rst复位引脚似乎存在问题,所以需要时在cpp代码里人为赋值0/1.
7. top.nxdc文件第一行是声明top文件的名字,如果你的verilog顶层模块文件就叫top.v,那么写作top=top即可。注意文件内部顶层模块也要叫top,不然找不到模块。
8.nvboard的代码似乎很吃内存,我注释了波形部分的代码,但是运行nvboard还是有点吃力,反应很慢,这个每个人的情况不太一样,比较迷。如果卡顿,那尽量把代码修改好以后再编译。
24/7/10 更新:
除过这些,我也看到了一个写的比较好的心得,可以用于参考,但最好还是自己认真过一遍:【一生一芯03】verilator仿真框架搭建-CSDN博客
里面有很多后续阶段才做的内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)