首页 > 其他分享 >ysyx:verilator的初步学习

ysyx:verilator的初步学习

时间:2024-01-25 18:00:28浏览次数:26  
标签:Vverilog1 int top ysyx 初步 verilog 模块 include verilator

虽然已经看过了c语言,但是verilator用的语法我还是第一次见。

module top(
  input a,
  input b,
  output f
);
  assign f = a ^ b;
endmodule             //这是verilog代码,单另起一个文件,后缀用.v  不要当成c的代码
------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

while (???) {   //伪代码,要修改
  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));
}

1. verilog的程序由模块组成。每个模块用module -----end module来进行分割。

2. 每个模块都需要声明input和output以及类型;模块的功能可以 用连续赋值语句(assign),过程赋值语句(always)。

3. verilog同样支持算术、逻辑、位运算符等,数组、常量等也支持。

  这个伪代码不能直接用,要自己动手改好。

 

修改后的c语言代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <verilated.h>
#include "Vverilog1.h"
int main() { int i=10;
Vverilog1 *top=new Vverilog1;
while (i--) { // 随机生成两个二进制数a和b int a = rand() & 1; int b = rand() & 1; // 把它们赋值给verilog模块的输入 top->a = a; top->b = b; // 调用eval函数来计算输出 top->eval(); // 打印结果 printf("a = %d, b = %d, f = %d\n", a, b, top->f); // 检查结果是否正确 assert(top->f == (a ^ b)); } return 0; }

verilator的效果类似把verilog语言定义的模块转化成一个类。c语言里可以直接引用头文件,然后调用。在调用时,需要同时引入verilated.h头文件和对应模块的头文件。对应模块的头文件名,就是verilog文件名,前面+V,比如我的模块文件名叫Verilog1.k,那么c语言里就要调用Vverilog1.h。(top这个模块名反而不重要)

eval()函数会由.h文件提供,不用再多做处理。

 

例子里的assign f=a^b就表示把a和b的按位异或结果赋值给f。 a或b其中有且只有一个为1,f为1. 反之f为0. 就这样实现了双控开关的效果。在主函数里面,随机生成了两个int变量a b,然后按位与,再调用top的eval函数,这个函数在这里的作用就是执行top模块的逻辑,更新当前top模块的内部状态

用以下代码来进行编译

verilator (-Wall) --cc Verilog1.v --exe test_verilog.c 

-Wall 表示开启警告   --cc表示生成c++的代码   -exe表示生成可执行文件(不是生成exe文件)

这一步后会生成一个obj_dir文件夹 .进入文件夹。然后用

make -f Vverilog1.mk

进行编译。编译好以后  ./Vverilog1即可查看效果。

程序输出了十次,正确表达了双控的模拟效果。

标签:Vverilog1,int,top,ysyx,初步,verilog,模块,include,verilator
From: https://www.cnblogs.com/namezhyp/p/17987169

相关文章

  • Django 初步使用
    Django框架系列目录Django框架系列一.安装启用1.1主流web框架概述1.2安装版本1.3启动的两种方式1)命令行创建2)pycharm创建3)两种方式的区别1.4配置文件介绍1.5创建应用二.Django初步使用2.1HttpResponse,render,redirect2.2配置静态文件1)添加路由对应关系views2)写后端......
  • 初步用VS实现三子棋游戏
     首先定义主函数intmain()在主函数中运行菜单和游戏函数voidmenu()voidgame() 菜单函数中要实现游戏的开始和退出,就要借用do、while循环。 游戏函数中要定义二维数组,用来打印棋盘格和存储数据。 以上为初步实现三子棋游戏的框架。......
  • 【数学】博弈论初步
    平等博弈问题的基本模型:一个状态DAG上的移动。解决博弈论的重要方法:打表。博弈论问题一般有一些方向:观察先手怎么做,后手怎么做。一般是一些显然的贪心策略。结合SG函数。结合已有模型。FergusonGame两堆石子,每次可以清空一堆,拆另一堆为两堆,无法操作者输。分......
  • 区块链技术初步认识
    概念:区块链(英文名:blockchain)是一种块链式存储、不可篡改、安全可信的去中心化分布式账本,它结合了分布式存储、点对点传输、共识机制、密码学等技术,通过不断增长的数据块链(Blocks)记录交易和信息,确保数据的安全和透明性。区块链的特点包括去中心化、不可篡改、透明、安全和可编程性......
  • volta初步使用
    volta是用于管理nodejs和包管理器的工具。安装与卸载volta安装教程、卸载教程总的来说windows上安装卸载都比较省事一些。确认是否安装成功volta-v安装完成后,默认情况下,并不会给你安装node环境。使用volta安装工具安装ndevoltafetchnode//安装最新稳定版本voltaf......
  • 最高法--结算协议中含有非工程款性质但与最终清算值密切相关的项目的,除另有相关证据表
    (2021)最高法民申7402号  天津北方华泰置业投资有限公司、中冶天工集团有限公司等建设工程施工合同纠纷民事申请再审审查民事裁定书申请人主张:华泰公司申请再审称,(一)原判决认定的基本事实缺乏证据证明。尽管华泰公司与中冶公司已经对审计机构出具的审计金额152655857.00元予以确......
  • PyTorch项目源码学习(3)——Module类初步学习
    torch.nn.ModuleModule类是用户使用torch来自定义网络模型的基础,Module的设计要求包括低耦合性,高模块化等等。一般来说,计算图上所有的子图都可以是Module的子类,包括卷积,激活函数,损失函数节点以及相邻节点组成的集合等等,注意这里的关键词是“节点”,Module族类在计算图中主要起到搭......
  • PyTorch项目源码学习(2)——Tensor代码结构初步学习
    PyTorch版本:1.10.0TensorTensor是Pytorch项目较为重要的一部分,其中的主要功能如存储,运算由C++和CUDA实现,本文主要从前端开始探索学习Tensor的代码结构。结构探索PyTorch前端位于torch目录下,从_tensor.py可以找到Tensor的python定义,可以看到其继承自torch._C._Tensorbase而Te......
  • Atlas初步调研
    简介Atlas是Hadoop生态的元数据管理框架,有以下功能特性:元数据类型:支持多种Hadoop和非Hadoop元数据的预定义类型,提供元数据定义新类型的能力,类型可以具有原始属性、复杂属性、对象引用,可以从其他类型继承。分类:提供动态创建分类的能力,元数据实体可以与多个分类相关联,具有分类传......
  • CTFpwn进阶之路从栈到堆---初步理解
    曾听过某大佬讲,pwn的等级大致分为三种,栈,堆,内核。这篇文章总结了我目前对堆的理解,肯定不够深入,不过我将更注重于偏抽象和本质的东西,希望各位看完能有些不同的收获。堆题小结就我目前的理解来说,堆和栈有个很不同的地方。栈的漏洞经常是可以栈溢出直接改变函数返回地址,通过pop|ret做到......