首页 > 其他分享 >一生一芯-verilator仿真环境

一生一芯-verilator仿真环境

时间:2024-01-26 17:02:30浏览次数:27  
标签:仿真 -- top contextp 一芯 int Vtop include verilator

1.参考:【一生一芯】搭建verilator仿真环境 - 老吴家的小阿哲 - 博客园 (cnblogs.com)

2.verilator探幽

(1)verilator工作原理

(2)一个简单的例子

1.将verilog代码写入文件top.v

2.将C++代码写入文件sim_main.cpp

3.使用下面的命令来运行Verilator:

verilator --cc --exe --build -j 0 -Wall sim_main.cpp top.v

4.使用 ./obj_dir/Vtop 来运行Verilator生成的可执行程序

(3)稍微复杂的例子

在Verilog中,assign 是一个关键字,用于为信号赋值

(一)在C++代码中设置跟踪,创建波形文件

1.编写top.v:

module top (
    input a,
    input b,
    output f
);
    assign f = a ^ b;
endmodule

2.编写main.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#include "verilated_vcd_c.h" // 生成vcd文件使用
#include "Vtop.h"
#include "verilated.h"

int main (int argc, char **argv) 
{
    if (false && argc && argv) {}
    const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext}; //创建一个动态分配的 VerilatedContext 对象,并使用 std::unique_ptr 来确保在不再需要时自动释放内存
    std::unique_ptr<Vtop> top{new Vtop{contextp.get()}};
    contextp->commandArgs(argc, argv);
    contextp->traceEverOn(true); // 生成波形文件使用,打开追踪功能
    VerilatedVcdC* ftp = new VerilatedVcdC; // vcd对象指针
    top->trace(ftp, 0); // 0层
    ftp->open("wave.vcd"); //设置输出的文件wave.vcd

    int flag = 0;

    while (!contextp->gotFinish() && ++flag < 20) 
    {
        int a = rand() & 1;
        int b = rand() & 1;
        top->a = a;
        top->b = b;
        top->eval();
        printf("a = %d, b = %d, f = %d\n", a, b, top->f);
        assert(top->f == (a ^ b));	//验证top->f == (a ^ b),若结果为假,程序终止,并输出错误信息

        contextp->timeInc(1); // 时间+1,推动仿真时间
 
        ftp->dump(contextp->time()); // dump wave    dump 方法通常用于将当前时间的信号状态写入到波形文件中
    }

    top->final();

    ftp->close(); // 必须有

    return 0;
}

3.使用如下命令:

verilator --cc --exe --build -Wall --trace top.v main.cpp

4.执行生成的Vtop可执行文件

./obj_dir/Vtop

5.shell观察波形

gtkwave wave.vcd
(二)在Verilog代码中设置跟踪,创建波形文件

1.top.v:

module top (
    input a,
    input b,
    output f
);
    assign f = a ^ b;

initial begin
    if ($test$plusargs("trace") != 0) begin			//在仿真开始时检查命令行参数,如果存在 "trace" 参数,则设置波形文件并将相关的信号状态写入到波形文件中
         $display("[%0t] Tracing to wave.vcd...\n", $time);
         $dumpfile("wave.vcd");
         $dumpvars();
      end
      $display("[%0t] Model running...\n", $time);
   end

endmodule

2.main.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#include "Vtop.h"
#include "verilated.h"

int main (int argc, char **argv) {
    if (false && argc && argv) {}
    const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext};
    std::unique_ptr<Vtop> top{new Vtop{contextp.get()}};
    contextp->commandArgs(argc, argv);
    contextp->traceEverOn(true); // 生成波形文件使用,打开追踪功能

    int flag = 0;

    while (!contextp->gotFinish() && ++flag < 20) {
        int a = rand() & 1;
        int b = rand() & 1;
        top->a = a;
        top->b = b;
        top->eval();
        printf("a = %d, b = %d, f = %d\n", a, b, top->f);
        assert(top->f == (a ^ b));

        contextp->timeInc(1); // 时间+1,推动仿真时间
    }

    top->final();

    return 0;
}

3.使用如下命令:

verilator --cc --exe --build -Wall --trace top.v main.cpp

4.执行生成的Vtop可执行文件

./obj_dir/Vtop

5.shell观察波形

gtkwave wave.vcd

标签:仿真,--,top,contextp,一芯,int,Vtop,include,verilator
From: https://www.cnblogs.com/xuanbol/p/17989755

相关文章

  • 一生一芯-Linux环境搭建
    1.gdb调试1.gdb-qFilename进入gdb调试器2.(gdb)b3 在第三行添加断点 breakpoint3.(gdb)run 执行程序4.(gdb)whatisiNum 查看iNum的数据类型5.(gdb)c 继续执行程序(直到下一个断点或者之后没有断点就运行完整个程序)6.(gdb) n 一步一步执行程序7.(gdb)piNu......
  • Altair SimSolid常见问题解答 衡祖仿真
    Q:SimSolid究竟有什么特别之处?A:AltairSimSolid是专为设计工程师开发的结构分析软件且非常有创新性。它消除了传统FEA中特别耗时和非常专业的两项庞大任务——几何结构简化和网格划分,是一场仿真变革。简而言之,就是不用做几何简化,不用画网格,复杂装配体数量没有上限,真实三维模型直......
  • ysyx:verilator的初步学习
    虽然已经看过了c语言,但是verilator用的语法我还是第一次见。moduletop(inputa,inputb,outputf);assignf=a^b;endmodule//这是verilog代码,单另起一个文件,后缀用.v不要当成c的代码------------------------------------------------------......
  • 基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022A 3.算法理论概述        多输入多输出(MIMO)技术是无线通信领域的关键技术之一,它利用多个天线同时发送和接收信号,可以显著提高系统容量和传输可靠性。在MIMO系统中,预编码技术是一种重要的信号处理技术,它......
  • 基于GoogleNet深度学习网络的花朵类型识别matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      花朵类型识别是计算机视觉领域中的一个重要任务。它在植物学研究、农业、园艺等领域有着广泛的应用。传统的花朵类型识别方法通常基于手工设计的特征提取器,这些方法的效果受限于特征提......
  • 利用SOLIDWORKS Flow Simulation来进行旋转流体仿真
    前段时间,一个朋友去到一家做水泵的行业,问我SOLIDWORKS能够做流体仿真么?我说,能啊。朋友又问,我现在做水泵,里面的叶片旋转,可以模拟么?我说,当然可以了啊。那么,我就做了个小例子给他,首先,我先建了个如下图所示模型,当然真正的泵不是这样的,我这个,只是玩具,甚至连玩具都称不上。  看到......
  • 基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本MATLAB2022a 3.算法理论概述       本课题,我们主要对MPSK和MFSK调制类型进行识别。在进行信号调制方式区分之前,首先需要对PSK和FSK进行区分,提出了一种基于信号功率谱的PSK和FSK调制方式的识别方法。信号的功率谱计算过程......
  • 基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
    1.算法运行效果图预览HS光流 LK光流  2.算法运行软件版本matlab2022a 3.算法理论概述      光流法是一种用于估计图像中像素或特征点运动的方法。在车辆检测与计数应用中,光流法可用于检测图像中车辆的运动,从而进行计数。这里我们将详细介绍Horn-Schunc......
  • 基于CMFB余弦调制滤波器组的频谱响应matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述        CMFB余弦调制滤波器组是一种基于余弦调制技术的滤波器组,它具有频率选择性和可调性,可以广泛应用于信号处理、图像处理、通信等领域。下面将详细介绍其原理、数学公式等。 3.1......
  • 基于MIMO通信系统的球形译码算法matlab性能仿真,对比PSK检测,SDR检测
    1.算法运行效果图预览 2.算法运行软件版本MATLAB2022A 3.算法理论概述      球形译码算法(SD)是一种基于多输入多输出(MIMO)通信系统的检测算法。与相移键控(PSK)和软件定义无线电(SDR)相比,它具有更高的频谱效率和可靠性,下面将详细介绍SD算法。       ......