【VerilogVCS仿真_2023.11.15】

news2024/11/20 16:35:59

HDL:硬件描述语言,并发,时序========RTL:寄存器传输级语言
Verilog和VHDL的区别:VHDL侧重于系统级描述——系统级设计人员所采用,Verilog侧重于模块行为的抽象描述——电路级设计人员

前端:系统级、算法级(c/matlab)、寄存器变换级(RTL Verilog/SV)
后端:逻辑门级、开关级、物理(版图)级

数字电路设计两个要素:线(wire)和器件(module)

RTL基本单元:寄存器、ALU、MUX等
电路的功能描述:算法状态机图、有限状态机、数据流图、控制流图

除endmodule、begin_end、fork_join外都要加分号
标识符只可以由字母、数字、下划线和$组成,开头必须是字母或下划线,是区分大小写的

数据类型

Verilog HDL19种中4个最基本的数据类型:Integer型(32位有符号整数)、parameter(符号常量)、reg型、wire型

常量

整数型常量:<位宽>'<进制><数字>
<数字>缺省十进制,32位

wire[31:0]a;//长度为32
wire[31] a;//长度为31,不建议

x表示不定值,z表示高阻值
最左边的x或z具有扩展性:8’bx1 =8’bxxxxxxx1
?是z的另一种表示符号,在case语句中使用

负数:在位宽前加一个减号
-8’d5 = 8’b1111_1011//5的补数(反码加1)

parameter常量的声明:module test # (parameter p=4’h1)
localparam和parameter的区别:parameter可做传递参数的接口

常用的三种变量:线网型,寄存器型,数组

线网型nets型:输出始终随输入的变化而变化的变量:wire,不能存值
表示以assign语句赋值的组合逻辑
缺省为wire型,位宽1bit

寄存器型register型:表示过程块(initial always task function)语句内的指定信号过程块中信号必须为reg型
reg生成触发器和组合逻辑,wire只能生成组合逻辑

数组型memory型:reg[n-1]存储器名[m-1;0];//m个位宽为n的存储单元
需指明赋值的存储单元rega[7:0]=0;//不合法 rega[7]=0;//合法

运算符

算术运算符(双目运算符):%取余:两侧均为整型,结果为第一个操作数的符号位;某一个为不定值x,结果为x
关系运算法(双目运算符):结果是逻辑值0、1、x,优先级低于算术运算符
逻辑运算符:&& ! ||,(a=3’bx0x && b=3’bx01) = (x && 1) = x非的优先级最高
位运算符:~按位取反 & | ^ ~/~同或,进行运算时位数少的高位自动补0
缩减运算符(单目运算符):& ~& | ~| ^ ~^,低位与第二位进行运算,直至最高位,结果缩减为1位二进制数 eg.b=|a;
移位运算符:用0补空位,左移扩充位数(乘以2n),右移数据丢失(除以2n)
位拼接符:{1’b0,xx……},{4{w}}={w,w,w,w},拼接时必须指明信号的位数,1默认为32位
等式运算符:(逐位相等结果为1,某些位为x或z结果为x) != =和!(case等式运算符,相应位完全一致结果为)xx;//x x===x;//1
条件运算符(三目运算符):信号=a?表达式1:表达式2;

运算符的优先级

在这里插入图片描述

连续赋值语句

assign语句,描述组合逻辑最常用的方法,不可出现在过程块中,并行的与位置顺序无关,与过程语句之间也是并行的

结构语句

在这里插入图片描述
不可综合的用在测试语句中

过程语句

always不断重复执行,直到仿真结束,initial只执行一次
always块中被赋值的只能是reg型,不加时序控制会导致仿真死锁(eg.always areg=~areg)
always@(*):电平触发,组合逻辑
如a=0等语句只能写在assign,always,initial赋值语句中,三者并行

块语句

begin_end

顺序执行语句,每条语句的延迟时间是相对于前一条语句的仿真时间而言的
begin:块名
块内声明语句;
语句;
end
存在块内声明语句(参数声明,reg变量声明,integer变量声明,real变量声明语句)时要加上块名

fork_join

并行执行语句,不可综合,用在测试文件中,时间排序在最后的语句执行结束或完成一个disable语句

条件语句

if-else语句

if(a)≠if(a==1)//当a为单比特时成立

case语句

每个值的位宽 必须相等,与控制表达式的位宽相同
在分支表达式中,?表示高阻态
按顺序判断,满足一个条件后执行就跳出case语句,故少用casex

casez,不匹配高阻态z的位
casex,不匹配高阻态z和不定值x的位
在这里插入图片描述
组合电路设计中,不加上else、default项,会生成隐含锁存器latch,q保持原值,加上后会生成选择器,故组合逻辑中必须要加上else、default项

循环语句

for语句

for(循环变量赋初值;循环执行条件;循环变量增值)执行语句

repeat语句

repeat(循环次数表达式)语句

while语句

while(循环执行条件表达式)执行语句
执行语句中必须有一条改变循环执行条件表达式的语句

forever语句

无条件连续执行forever后面的语句或语句块
必须要写在initial过程块中,不可综合,用在测试文件中
使用时块要加块名,然后用disable加块名,跳出循环

编译预处理语句

宏定义语句define 标志符(即宏名) 字符串(即宏内容)//没有分号 define IN a+b+c+d
使用方法:`IN

文件包含语句`include “文件名"或"文件绝对路径或相对编译文件的路径”//include后面一定要有空格

时间尺度语句`timescale

系统任务语句

显示和写任务:

$display(“a is %b”,a),二进制显示空位会显示零,十进制会空出位数,(%0b显示实际位数)自动换行
w r i t e 不会自动换行 write不会自动换行 %c或%C:ASCII字符,%s或%S:字符串,%t或%T:当前时间格式("%t", write不会自动换行time)
可以直接使用 t i m e , time, timedisplay($time,“%d”,a);//没有指定时间格式,按十进制显示
\n换行,\t制表符,\字符\

监控任务:

$monitor:连续监控指定的参数,参数发生变化打印
$monitoroff停止 $monitoron启动

文件输出任务:从文本文件中读取数据并将数据加载到存储器中

$readmemb读取二进制格式数
r e a d m e m h 十六进制格式: readmemh十六进制 格式: readmemh十六进制格式:readmemb(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);//没有起始和结束地址则存储器从其最低位开始加载数据直到最高位

仿真时间函数

$time
$realtime
不同之处:返回64位整型时间/返回实型时间(带有小数)

随机函数random(伪随机)

rand=KaTeX parse error: Expected '}', got 'EOF' at end of input: …//-59~59 rand={rand}%60//0~59
在这里插入图片描述在这里插入图片描述

仿真控制任务

$finish(建议使用) $stop(只是暂停仿真)

阻塞赋值与非阻塞赋值

阻塞赋值立即改变,可综合的阻塞赋值操作不能设定有延迟(即使是零延迟,延迟后才赋值,不可综合)
非阻塞赋值在块语句结束后才赋值,只能对寄存器变量进行赋值,故只能用在initial和always块等过程块中,非阻塞赋值不允许用于连续赋值
always块建立组合逻辑模型时,用阻塞赋值
同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值,不要混用
赋值时不要使用#0延迟

任务和函数语句

task语句

任务定义:task<任务名>;
端口及数据类型声明语句;//不用声明数据类型,sv中默认为logic
其他语句;
endtask
任务调用:<任务名>(端口1,端口2……);//端口一一对应

多输入多输出
可包含定时控制语句 包含定时控制语句的任务是不可综合的(# @ wait)
任务的定义与调用必须在一个module中
可调用函数和任务函数
在任务定义结构内不能出现initial和always过程块
任务调用语句只能出现在过程块内

function语句

函数定义:function<返回值位宽或类型说明>函数名;//缺省返回1位reg型数据
端口声明;//至少一个输入参量,无输出(不可有输出或双向变量)
局部变量定义;
其他语句;//必须有一条赋值语句
endfunction
函数调用:<函数名>(端口)
函数在模块内部定义,通常在本模块中调用,也可以从其他模块调用
不可包含定时控制语句,可综合,每调用一次函数,相当于改变此电路的输入得到相应计算结果
可调用函数语句,不可任务函数

模块的调用

端口可以位置关联或名称关联

仿真:前(RTL)仿真,逻辑网表仿真,门级仿真和布线后仿真

tb文件中端口与输入端口连接为reg型,输出端口连接为wire型

inclule "xxx.v" timescale 1ns/1ps
可不写,files.f和Makefile文件已完成

时钟激励的产生

reg clk;
initial begin
	clk=0;
end
always #10 clk=~clk;
=====================
always begin
	#10 clk=0;
	#10 clk=1;
end
=====================
initial begin
	clk=0;
	forever #20 clk=~clk;
end

参数传递

module Decoder(A,F);
parameter W=1;
parameter P=1;
……
调用:Decode #(4,0) u_D2(a,b);//位置关联
Decode #(.W(4),.P(0)) u_D2(a,b);//位置关联

悬空端口

输入管脚悬空为高阻z,输出管脚悬空管脚废弃不用

VCS仿真mux2to1

源文件和tb文件代码,tb文件中输入为wire型,输出为reg型
在这里插入图片描述
将源文件、tb文件、Makefile、files.f放入一个mux2to1文件夹,进入文件夹运行make all
在这里插入图片描述

跑eda工具,执行命令make all,要和Makefile文件同级
在这里插入图片描述
点击向下小箭头显示波形

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

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

相关文章

[数据结构]深入浅出讲解二叉树-平衡二叉树-左右旋转

树是一种数据结构&#xff0c;单位为Node(节点)。不同于链表的直线排列&#xff0c;树呈现一种自上而下的分层排序规则。 树->数据结构&#xff1a; 单元为Node(节点)->当这样的节点多了 就可以关联出不同的形态 一个父节点有一个左子节点&#xff0c;有…

11.31链表,之前的数据结构(未完,饼)

根据输入序列建立二叉树 链表 回顾一下二分面积最小 一些性质题回顾 哈夫曼树构建 第十一周——哈夫曼树 5 1 2 2 5 9 37 桶排序 #include <iostream> #include <vector> #include <algorithm> #include<stack> #include<queue> #includ…

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…

Linux MIPI 调试中常见的问题

一、概述 做嵌入式工作的小伙伴知道&#xff0c;有时候程序编写没有调试过程中费时&#xff0c;之间笔记里有 MIPI 摄像头驱动开发的过程&#xff0c;有需要的小伙伴可以参考&#xff1a;Linux RN6752 驱动编写。而我也是第一次琢磨 MIPI 协议&#xff0c;其中有很多不明白的地…

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右&#xff0c;移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…

进程间通信2

3. system V-IPC 3.1 知识点 ipcs -a查看所有的ipc对象 在系统中他们都使用一种叫做 key 的键值来唯一标识&#xff0c;而且他们都是“持续性”资源——即他 们被创建之后&#xff0c;不会因为进程的退出而消失&#xff0c;而会持续地存在&#xff0c;除非调用特殊的函数或者…

带你手搓阻塞队列——自定义实现

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是——阻塞队列的自定义实现&#xff0c;通过自定义实现一个阻塞队列&#xff0c;可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章…

C++stack

目录 1.什么是stack 2.容器适配器 3.stack的使用 top push pop 4.模拟实现stack 1.什么是stack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。(后进先出) 2. stack是作为容…

进程间通信方式——管道

进程间通信方式——管道 1、管道2、匿名管道2.1 创建匿名管道2.2 进程间通信 3、有名管道3.1 创建有名管道3.2 进程间通信 4、管道的读写行为 原文链接 1、管道 管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质…

深入 C 语言和程序运行原理 实战项目代码在CentOS 7上编译

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 安装gtest 参考博客《使用gtest和lcov测试代码覆盖率》 wget https://github.com/google/googletest/archive/refs/…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日&#xff0c;中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了&#x1f4a5;我已经后悔了&#x1f62d;后悔没早点学习鸿蒙 HarmonyOS 概念&#xff0c;系统定位 1&#xff1a;鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统&#xff0c;它具有以下特别之处&#xff1a; 2&#xff1a;分布式架构&#xff1a;…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言&#xff1a; 今天&#xff0c;在互联网行业&#xff0c;超过30岁的工程师往往被认为是“码农”的生命周期终点。然而&#xff0c;华为鸿蒙系统的崛起&#xff0c;却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢&#xff0c;导致…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求&#xff1a; 默认一行展示4个卡片&#xff1b;当屏幕小于某个大小的时候&#xff0c;一行展示3个卡片&#xff1b;再小就展示2个&#xff1b;以此类推&#xff0c;最小就展示1个。 效果卡片样式如下图&#xff1a; 默认一行4个 屏幕缩小到某个阈值&#xff0c;一行展示…

11.26电梯控制器设计分析

项目三 电梯控制器设计&#xff08;*****&#xff09; 设计一个多楼层的电梯控制器系统&#xff0c;并能在开发板上模拟电梯运行状态。可以利用按键作为呼叫按键&#xff0c;数码管显示电梯运行时电梯所在楼层&#xff0c;led灯显示楼层叫梯状态。 就是初始默认在1楼&#xff0…