Linux 系统下 “Verilog” 编程配置

news2024/9/27 16:54:09

文章目录

  • 简介
    • Verilog HDL
    • Iverilog
    • Gtkwave
  • 环境搭建
    • 软件的安装
    • Vim 之 Verilog 语法高亮配置
  • 简单的计数器示例
    • 计数器程序的编写
    • 仿真测试


简介


Verilog HDL

Verilog HDL 是一种用于设计数字电路的硬件描述语言,它可以用来描述数字电路的功能和结构,并且可以被编译器转换成可以在现实世界中运行的电路。

Verilog HDL语言 由一系列的关键字、表达式和语句组成,这些元素可以用来描述电路的输入、输出和内部状态。


Iverilog

Iverilog 是一种基于 Verilog HDL 的综合工具,用于将 Verilog HDL代码 转换成可以在现实世界中运行的硬件电路。Iverilog 使用一种叫做 ”门级综合” 的技术来生成电路模型,它可以将 Verilog HDL代码 转换成门级电路模型,也可以将其转换成可以在 FPGA 或其他硬件平台上运行的实际电路。

Iverilog 还提供了一些其他的功能(例如:模拟和验证电路的功能以及自动化测试平台的集成等),这些功能使得 Iverilog 成为数字电路设计领域的一种非常有用的工具。


Gtkwave

Gtkwave 是 Xilinx 公司开发的一种用于设计和验证 GTX(通用图形处理器)的工具,同时也可以用于 iverilog 仿真和查看仿真波形。它提供了一个简单易用的界面,可以帮助用户快速设计和验证 GTX 芯片,并可以自动生成用于 FPGA 或 ASIC 实现的代码。它还支持多种硬件描述语言,如 Verilog HDL、VHDL 等,方便用户将设计转换为可实现的硬件电路。

运用 gtkwave 软件进行 iverilog 仿真时,用户可以设置仿真参数,如仿真时间、仿真精度等,并可以选择不同的模块进行仿真。仿真结果会以波形的形式显示在软件界面上,用户可以通过调整波形的显示方式和参数来更好地观察和理解仿真结果。同时,gtkwave 软件还提供了多种工具,如波形缩放、标记、测量等,帮助用户更方便地分析和验证设计。


环境搭建


软件的安装

(1)Iverilog 的安装

  • 在 Linux 系统下,打开终端并执行以下命令进行安装。
sudo apt-get install iverilog
  • 安装成功后,执行 man iverilog 命令可以查看 iverilog 软件的使用方法,如下图所示。

注:安装 ivreilog 软件的同时会安装 vpp 软件,该软件是 Verilog 的仿真软件。

(2)GTKWave 的安装

  • 在 Linux 系统下,打开终端并执行以下命令进行安装。
sudo apt-get install gtkwave
  • 安装成功后,执行 man iverilog 命令可以查看 gtkwave 软件的使用方法,如下图所示。

注:gtkwave 是一款功能强大的 GTX 设计和验证工具,同时也是 iverilog 仿真和波形查看的有力工具,为用户提供了方便、高效的设计和验证环境。


Vim 之 Verilog 语法高亮配置

(1)基本配置

  • 打开 Linux 终端,执行以下命令对 VIM 进行配置。
vim ~/.vimrc
  • 编辑 .vimrc 文件,添加以下内容并保存退出。
set nocompatible "不兼容vi
syntax on  "语法高亮度显示 
set noerrorbells " 不让vim发出讨厌的滴滴声 
set shortmess=atI " 启动的时候不显示那个援助索马里儿童的提示 
set t_Co=256  "开启256色支持
set hlsearch  "搜索设置高亮
colorscheme desert "配色方案
set background=dark "配置主题整体的色调,只有两个选择:dark和light(暗色调和亮色调)
highlight Function cterm=bold,underline ctermbg=red ctermfg=green "color set
set nu  "显示行号
set relativenumber "显示相对行号
set cursorcolumn "add cursor in column
set cursorline "add cursor in line 
"set guifont=Monospace\ 16 "gui style
set guifont=Courier_new:h16
set lines=35 columns=118 "其中lines是窗口显示的行数,columns是窗口显示的列数
winpos 200 100 "后面两个参数指的自屏幕左上角像素值参考位置
set tabstop=4 "tab键相当于4个空格键
set expandtab "來將 tab 转成 space  combine with tabstop
set shiftwidth=4 "换行自动变为空格
set autoindent "设置自动缩进  自动缩进,当你第一行敲 tab + 文字 回车后 下一行自动给你加个 tab 
set backspace=2 "enable backspace
set novisualbell "不要闪烁
set laststatus=2 "启动显示状态行
set encoding=utf-8 "文件编码

inoremap ( ()<ESC>i
inoremap [ []<ESC>i

"ban up and also keys 
imap <Up> <Nop>
imap <Down> <Nop>
imap <Left> <Nop>
imap <Right> <Nop>
nmap <Up> <Nop>
nmap <Down> <Nop>
nmap <Left> <Nop>
nmap <Right> <Nop>

imap jk <Esc>  "在编辑模式下使用jk替代ESC进入命令模式
nmap ,l ^
nmap ,r $

"进行版权声明的设置
"添加或更新头
map <F3> :call TitleDet()<cr>'s
function AddTitle()
    call append(0,"/*=============================================================================")
    call append(1,"#")
    call append(2,"# Author: meng  - email@vip.qq.com")
    call append(3,"#")
    call append(4,"# QQ : xxxxxxxxx ")
    call append(5,"#")
    call append(6,"# Last modified: ".strftime("%Y-%m-%d %H:%M"))
    call append(7,"#")
    call append(8,"# Filename: ".expand("%:t"))
    call append(9,"#")
    call append(10,"# Description: ")
    call append(11,"#")
    call append(12,"=============================================================================*/")
    echohl WarningMsg | echo "Successful in adding the copyright." | echohl None
endf
"更新最近修改时间和文件名
function UpdateTitle()
    normal m'
    execute '/# *Last modified:/s@:.*$@\=strftime(":\t%Y-%m-%d %H:%M")@'
    normal ''
    normal mk
    execute '/# *Filename:/s@:.*$@\=":\t\t".expand("%:t")@'
    execute "noh"
    normal 'k
    echohl WarningMsg | echo "Successful in updating the copy right." | echohl None
endfunction
"判断前10行代码里面,是否有Last modified这个单词,
"如果没有的话,代表没有添加过作者信息,需要新添加;
"如果有的话,那么只需要更新即可
function TitleDet()
    let n=1
    "默认为添加
    while n < 10
        let line = getline(n)
        if line =~ '^\#\s*\S*Last\smodified:\S*.*$'
            call UpdateTitle()
            return
        endif
        let n = n + 1
    endwhile
    call AddTitle()
endfunction

(2)加载高亮文本

  • 在 Linux 系统的家目录下的 .vim 文件夹中新建 syntaxftdelect 文件夹,依次执行以下命令。
mkdir ~/.vim/ftdelect
mkdir ~/.vim/syntax
  • ftdelect 目录下新建一个名为 sv.vim 的文本文件,并编辑添加以下内容。
au BufReaad,BufNewFile *.sv set filetype=systemverilog
  • 下载 Verilog 语法高亮文件,下载后重命名为 systemverilog.vim ,并放入到 syntax 目录下,重启 VIM 后便配置成功,效果如下图所示。


简单的计数器示例


计数器程序的编写

(1)在任意目录下,创建一个名为 count.v 的仿真文件,并编写 Verilog HDL 计数器程序,该程序的具体内容如下。

module counter(out, clk, reset);

parameter WIDTH = 8;

input clk, reset;
output [WIDTH - 1 : 0] out;

reg [WIDTH - 1 : 0] out;
wire clk, reset;

always @(posedge clk)
        out <= out + 1;

always @reset
        if (reset)
                assign out = 0;
        else
                deassign out;
endmodule

(2)创建一个名为 sim_count.v 的测试文件,并编写 testbench,该 testbench 的内容如下所示。

`timescale 1ns/1ns

module sim_count;

reg reset = 0;

initial
begin
#17 reset = 1;
#11 reset = 0;
#29 reset = 1;
#11 reset = 0;
#250 $stop;
end

reg clk = 0;
always #5 clk = !clk;

wire [7 : 0] value;
counter cqupthao(value, clk, reset);

initial
$monitor("When time is %t (ns), value = %h (%0d)" , $time, value, value);

initial
begin
        $dumpfile("sim_count.vcd");
        $dumpvars(0, sim_count);
end

endmodule

其中,$dumpfile("sim_count.vcd") 中的 sim_count.vcd 为指定存储的文件名,$dumpvars(0, sim_count) 中的 sim_count 为模块名。


仿真测试

  • 方式一

(1)将以上的仿真文件 count.v 和测试文件 sim_count.v 打包成一个 vvp 文件,在 Linux 终端执行以下命令。

iverilog -o count.vvp count.v sim_count.v 

(2)将打包成的 vvp 文件转换为 vcd 文件提供给 gtkwave 软件使用,在终端中执行以下命令。

vvp -n count.vvp -vcd

正确运行以上命令后,会输出如下图所示的结果。

注意:此刻,该项目的目录下有 count.v count.vvp sim_count.v sim_count.vcd 四个文件。

(3)成功转换文件之后将此文件导入 gtkwave 软件中,在终端中执行以下命令。

gtkwave sim_count.vcd

(4)gtkwave 软件运行成功后,点击下图中左上角的 cqupthao,会出现对应的信号。

(5)选中信号后,鼠标右键点击 Insert 后,就能看见如下图所示的波形!


  • 方式二

(1)在 Linux 终端执行以下命令。

iverilog -o simname count.v sim_count.v 

注:在参数 -o name 中,name 是输出的文件名,输出的文件是一个可执行文件。

(2)执行该文件后会出现 .vcd 波形文件 vcd ,提供给 gtkwave 软件使用,在终端中执行以下命令。

./simname

正确运行以上命令后,会输出如下图所示的结果。

注意:此刻,该项目的目录下有 count.v sim_count.v sim_count.vcd simname 四个文件。

(3)成功转换文件之后将此文件导入 gtkwave 软件中,在终端中执行以下命令。

gtkwave sim_count.vcd

(4)gtkwave 软件运行成功后,点击下图中左上角的 cqupthao,会出现对应的信号。

(5)选中信号后,鼠标右键点击 Insert 后,就能看见如下图所示的波形!


  • 参考博文:linux 运行verilog,Linux | “搭建verilog学习环境”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云服务器AccessKey执行命令

人之所以痛苦&#xff0c;在于追求错误的东西。如果你不给自己烦恼&#xff0c;别人也永远不可能给你烦恼。因为你自己的内心&#xff0c;你放不下。 好好的管教你自己&#xff0c;不要管别人。 漏洞实战 查看所有实例信息 A.exe -a xxx -s xxx ecs -list执行命令 A.exe -a…

新能源汽车充电桩最重要的模块设备是什么

你是否曾经遇到过充电桩无法给你电动汽车提供电源的问题?或者你曾经怀疑过为什么充电桩速度如此缓慢?其实&#xff0c;这一切都可能与充电桩最重要的模块设备——控制主板有关。 交流充电桩由充电桩外壳、控制主板、刷卡模块、计费控制、显示屏、通信模块、继电器、开关电源等…

JumpServer堡垒机

文章目录 JumpServer堡垒机堡垒机介绍堡垒机产生的原因堡垒机主要功能 Jumpserver安装与配置Jumpserver Web界面用户管理资产管理添加Linux主机 命令过来规则创建审计台操作说明会话审计日志审计 工作台操作说明邮箱配置 JumpServer堡垒机 堡垒机介绍 下图来自百度百科 堡垒机…

面试常问八股文之java篇

JAVA篇 1、为什么重写equals方法的时候要重写hashCode方法&#xff1f; 为了不违背“相同对象必须要有相同hash值"的约定&#xff0c;对于基本数据类型比较的是数值是否相等&#xff0c;对于引用类型数据比较的是对象地址是否同等&#xff0c;在object中equal方法也是默…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

软件升级相关

文章目录 一、升级方案1、移动端升级2、window 升级SquirrelSparkle 一、升级方案 1、移动端升级 腾讯Bugly &#xff0c;支持Android 平台、iOS平台、Cocos2D、Unity3D。 2、window 升级 windows的exe的打包及升级工具 Squirrel Squirrel 是一款免费的开源exe升级工具&a…

NFT市场泡沫破裂了吗?投资NFT是否仍然安全?

近期&#xff0c;NFT市场的价格出现了明显的下跌趋势&#xff0c;许多人开始担心NFT市场是否已经进入了泡沫破裂的阶段。但是&#xff0c;我们需要认真分析这个问题&#xff0c;并且探讨投资NFT是否仍然安全。 NFT&#xff08;Non-Fungible Token&#xff09;是一种非同质化代币…

JMerter安装配置以及使用(笔记记录)

JMerter安装配置以及使用&#xff08;笔记记录&#xff09; 安装JDK安装JMeterJMeter使用元件执行的顺序参数详解参数配置之CSV数据文件设置断言响应断言JSON断言 数据提取XPath提取器JSON提取器 JMeter属性JMeter录制脚本JMeter直连数据库逻辑控制器如果&#xff08;IF&#x…

reference文献引用列表要求

目录 1、基本要求 2、文献格式 3、引用技巧 4、特殊情况&#xff1a; 有新闻和网络文章的引用&#xff1a; 1、基本要求 对于每一篇paper&#xff0c;我们需要按照文中出现的顺序&#xff0c;列出文中引用的所有文献。 对于文献的引用有如下要求&#xff1a; a】顺序要求…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;…

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积…

MonsterInsights Pro 8.18.0 Google Analytics + All Addons Pack

MonsterInsights适用于 WordPress 的 Google Analytics&#xff08;分析&#xff09;插件&#xff0c;功能强大 MonsterInsights 是适用于 WordPress 的最佳 Google Analytics&#xff08;分析&#xff09;插件。这些功能使 MonsterInsights 成为市场上功能最强大且用户友好的 …

网络通信原理(第十八课)

网络通信原理(第十八课) 4.1 回顾 1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网…

Linux笔记——磁盘进行分区与挂载介绍

系列文章目录 Linux笔记——管道相关命令以及shell编程 文章目录 系列文章目录 前言 分区与挂载 1 分区 1.1 分区示意图​编辑 1.2 分区介绍 2 硬盘的挂载 3 增加一块硬盘 3.1 增加一块硬盘 3.2 硬盘进行分区 3.3 格式化磁盘 4 卸载 5 查看磁盘使用情况 6 一些…

javascript 7种继承-- 原型链继承分析(1)

文章目录 概要继承的进化史技术名词解释原型链的作用原型链继承案列分析源代码解析效果图预留问题小结 概要 这阵子在整理JS的7种继承方式&#xff0c;发现很多文章跟视频&#xff0c;讲解后都不能让自己理解清晰&#xff0c;索性自己记录一下&#xff0c;希望个位发表需要修改…

10分钟实现任务调度平台搭建

日常项目中&#xff0c;会有很多需要定时执行的任务&#xff0c;而这些任务的变化比较多&#xff0c;可能随时都要调整&#xff0c;那么对调度的灵活性要求比较高。我们传统的Spring Task或者Quartz&#xff0c;可以实现定时任务调度&#xff0c;但是内置在代码里&#xff0c;修…

Matlab Kappa系数和总体精度OA计算

axlsread(D:\homework\精度验证产品.xlsx); Predicteda(:,1); vala(:,2); g0; for i1:size(a,1) %记录验证结果是否与实际值一致if(Predicted(i)val(i))gg1;end end OAg/(size(a,1));% 计算混淆矩阵 confusion_matrix confusionmat(val, Predicted);% 计算总样本数 total_sa…

全方位对比 Postgres 和 MongoDB (2023 版)

本文为「数据库全方位对比系列」第二篇&#xff0c;该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …

Qt Core学习日记——第九天QObjectData

本文结合示例代码更易理解&#xff0c;moc_XTest.cpp文件是写好XTest.h、XTest.cpp后由qt编译生成 版本 Qt5.15.2 示例代码 XTest.h #pragma once #include <qobject.h> #include <QFlags> class XTest : public QObject { Q_OBJECT Q_CLASSINFO("au…

【JavaEE初阶】HTTP请求的构造及HTTPS

文章目录 1.HTTP请求的构造1.1 from表单请求构造1.2 ajax构造HTTP请求1.3 Postman的使用 2. HTTPS2.1 什么是HTTPS?2.2 HTTPS中的加密机制(SSL/TLS)2.2.1 HTTP的安全问题2.2.2 对称加密2.2.3 非对称加密2.2.3 中间人问题2.2.5 证书 1.HTTP请求的构造 常见的构造HTTP 请求的方…