首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

一生一芯 预学习阶段 verilator学习以及双控开关的示例详解

  • 25-03-02 21:23
  • 4273
  • 6861
blog.csdn.net

一、简介

上一篇文章已经讲过了verilator官方提供的C++示例。

链接:一生一芯 预学习阶段 搭建verilator仿真环境 以及 运行官方示例-CSDN博客

在一生一芯学习的教程文档中也有一个双控开关的示例,但是提供的代码需要我们自己进行修改才能完善。源代码如下,这是不能正常仿真的:

因此接下来分两步来完成这个示例:

  • 1、学习verilator,以及它的操作(会有一些拓展)

(本部分借用verilator官方例程学习,链接:Example C++ Execution — Verilator Devel 5.027 documentation);

  • 2、完成该示例。

二、详解

1、verilator的学习

1)、Verilator 基本介绍

Verilator 本质上是一个 Verilog / SystemVerilog 仿真器。 它速度快,免费,开源。但不能直接替代 Modelsim、Questa Sim、Synopsys VCS、Vivado Xsim 和其他基于事件的仿真器。 Verilator 是一种基于周期的仿真器,这意味着它不会评估单时钟周期内的时间,也不会仿真精确的电路时序, 电路状态通常在每个时钟周期评估一次,因此无法观察到周期内的任何故障,也不支持定时信号延迟。 

Verilator 要求将 C++ 测试平台编译成本地系统二进制文件。

但是,我们不能将我们的 Verilog / System Verilog  模块原封不动地加入 C++ 测试平台,我们首先需要使用 Verilator 将 Verilog / System Verilog 代码转换为 C++,或者说 "Verilate"(验证)它。

也就是说Verilator 是把 .v 的文件编译成C++文件,再进行验证。工作的流程图如下:

执行如下代码后就将所有编译后的文件加入到 obj_dir文件中:

 verilator --cc example.v

会生成很多类似文件:

$ ls -l obj_dir/
Vexample___024unit.cpp  Vexample___024unit__Slow.cpp  Vexample.cpp  Vexample.mk
Vexample__Syms.cpp  Vexample__ver.d Vexample___024unit.h    Vexample_classes.mk
Vexample.h    Vexample__Slow.cpp  Vexample__Syms.h    Vexample__verFiles.dat

  • .mk 文件将与 Make 一起用于构建我们的仿真可执行文件;
  • .h 和 .cpp 文件包含我们的 C++ 头文件和实现源代码;
  • Vexample.h 这是主设计头文件,包含转换后的 "example "类定义,将在 C++ 测试平台中将其 "实例化 "为 DUT;
  • Vexample___024unit.h 这是 "example "类的内部头文件,其中包含 operation_t 类型定义;

到此DUT模块算是完成。

接下来看testbench(C++)

官方说明文档给出的C++示例:

  1. #include "Vour.h"
  2. #include "verilated.h"
  3. int main(int argc, char** argv) {
  4. VerilatedContext* contextp = new VerilatedContext;
  5. contextp->commandArgs(argc, argv);
  6. Vour* top = new Vour{contextp};
  7. while (!contextp->gotFinish()) { top->eval(); }
  8. delete top;
  9. delete contextp;
  10. return 0;
  11. }

先看头文件:

我们需要include Verilator 安装时附带的 以访问常用的 Verilator 例程,

另外还有 #include  ,将波形写入 VCD文件;

"Vour.h "包含了我们的 Verilated  ALU 模块的顶层类;

还可以# include "Valu___024unit.h", 包含了我们的 typedef 枚举的 Verilated 版本。

头文件内容到此。

接下来是比较重要的主函数:

  1. # 是这一部分
  2. int main(int argc, char** argv) {
  3. VerilatedContext* contextp = new VerilatedContext;
  4. contextp->commandArgs(argc, argv);
  5. Vour* top = new Vour{contextp};
  6. /*<......>*/
  7. delete top;
  8. delete contextp;
  9. return 0;
  10. }

这一部分

Vour* top = new Vour{contextp};

这样的代码,这个代码就类似于SV里面的 example dut_1 (.*); 也就是将模块例化进去。

其中 dut 就是例化的名字。

这一行代码

  1. VerilatedContext* contextp = new VerilatedContext;
  2. contextp->commandArgs(argc, argv);

用 VerilatedContext 创建一个 contextp 的对象,contextp 的对象里面有commandArgs方法;里面有argc和argv两个参数。

这一行:

Vour* top = new Vour{contextp};

用 Vour 的类创建一个 top 的对象并new 一下,Vour应该是来源于 "Vout.h" 的头文件。

最后的几行:

  1. delete top;
  2. delete contextp;
  3. return 0;

就是清空内存。

2)、示例完成代码

 DUT模块代码:

  1. module switch(
  2. input a,
  3. input b,
  4. output f
  5. );
  6. assign f = a ^ b;
  7. endmodule

sim.cpp文件代码(我做了两种写法):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include "Vswitch.h"
  5. int main(int argc, char** argv){
  6. VerilatedContext* contextp = new VerilatedContext;
  7. contextp->commandArgs(argc, argv);
  8. Vswitch* top = new Vswitch{contextp};
  9. while (!contextp->gotFinish()){
  10. int a = rand() & 1;
  11. int b = rand() & 1;
  12. top->a = a;
  13. top->b = b;
  14. top->eval();
  15. printf("a = %d, b = %d, f = %d\n", a, b, top->f);
  16. assert(top->f == (a ^ b));
  17. }
  18. delete top;
  19. delete contextp;
  20. return 0;
  21. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include "Vswitch.h"
  5. int main(int argc, char** argv) {
  6. Verilated::commandArgs(argc,argv);
  7. Vswitch *top = new Vswitch("top");
  8. while (!Verilated::gotFinish()){
  9. int a = rand() & 1;
  10. int b = rand() & 1;
  11. top->a = a;
  12. top->b = b;
  13. top->eval();
  14. printf("a = %d, b = %d, f = %d\n", a, b, top->f);
  15. assert(top->f == (a ^ b));
  16. }
  17. delete top;
  18. return 0;
  19. }

我认真为这两种区别就是argc和argv这两个参数能不能单独访问。

同时argc和argv这两个参数的值应该就来自于终端中输入的参数。

两个模块写完之后执行如下代码:

  1. $ verilator --cc --exe --build -j 0 -Wall sim.cpp switch.v
  2. $ obj_dir/Vswitch

指令解读:

$ verilator <options> <verilog-file> <cpp-file>

其中, 是需要仿真的 Verilog 文件, 是手动编写的 C++ 激励文件。 是一些编译选项,这里列出一些常用的编译选项:

  • --cc:指定将 Verilog 代码转化为 C++ 代码;
  • --exe:指定生成目标为可执行文件;
  • --build:直接编译生成目标文件;
  • --trace:导出波形文件时需要添加此选项;
  • --top-module :指定 Verilog 顶层模块;
  • --Mdir :指定生成文件的目录;
  • -CFLAGS :指定一个 GCC 的编译选项;
  • -I :可以指定一个包含路径。

终端中就会有结果不断输出,如图:

因为不会停止,所以要按 。

关于不会停止的问题,应该是 !contextp->gotFinish() 的问题;

gotFinish() 是 VerilatedContext 类的一个成员函数,它用于检测仿真是否收到了结束信号(如 $finish 或 $stop 语句)

因为DUT中没有相关可以暂停的语句,因此我做了如下修改:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include "Vswitch.h"
  5. int main(int argc, char** argv){
  6. VerilatedContext* contextp = new VerilatedContext;
  7. contextp->commandArgs(argc, argv);
  8. Vswitch* top = new Vswitch{contextp};
  9. int counter = 0;
  10. while (!contextp->gotFinish()){
  11. int a = rand() & 1;
  12. int b = rand() & 1;
  13. top->a = a;
  14. top->b = b;
  15. top->eval();
  16. printf("a = %d, b = %d, f = %d\n", a, b, top->f);
  17. assert(top->f == (a ^ b));
  18. counter++;
  19. }
  20. delete top;
  21. delete contextp;
  22. return 0;
  23. }

实现了值计算十次后暂停,结果如下:

注:本文转载自blog.csdn.net的丶七年先生的文章"https://blog.csdn.net/weixin_45041054/article/details/140802780"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

123
硬件开发
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top