日常记录(6)Verilog

发布时间 - 2025-06-27 00:00:00    点击率:

秒的换算

https://baike.baidu.com/item/%e7%a7%92/2924586

1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(幺秒)

时间单位1ns,10fs精度

代码语言:javascript代码运行次数:0运行复制
`timescale 1ns/10fs
不可综合

https://www.cnblogs.com/jiu0821/p/4166192.html

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:

(1)不使用initial。

(2)不使用#10。

(3)不使用循环次数不确定的循环语句,如forever、while等。

(4)不使用用户自定义原语(UDP元件)

(5)尽量使用同步方式设计电路。

(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。

(12)避免混合使用上升沿和下降沿触发的触发器。 不可综合verilog语句 1、initial

2、events

3、real

4、time

5、force 和release

6、assign 和deassign 不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。

7、fork join 不可综合,可以使用非块语句达到同样的效果。

8、primitives 支持门级原语的综合,不支持非门级原语的综合。

9、table 不支持UDP 和table的综合。 10、敏感列表里同时带有posedge和negedge always @(posedge clk or negedge clk) begin...end 这个always块不可综合。 11、同一个reg变量被多个always块驱动

12、延时以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。

如:a=#10 b; 这里的#10是用于*时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;

13、与X、Z的比较

惯性延时和传输延时

@和wait的区别

两个概念,但是还有点相同的地方。主要是用法的差异。@应该是某时刻点的一种触发,wait似乎是等待一段时间。

在竞争关系中,使用wait可以缓解事件偶尔未被触发。

https://blog.csdn.net/qq_41894346/article/details/104964478

在Verilog中当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争就出现了。如果触发线程先于阻塞线程,则触发无效(触发是一个零宽度的脉冲)。

Systemverilog 引入了triggered()函数,用于检测某个事件是否已被触发过,包括正在触发。线程可以等待这个结果。

代码语言:javascript代码运行次数:0运行复制
event a;    //使用关键字event来声明一个事件ainitial begin    #1;    ->a;endinitial    begin    #1;    @a;        //第一个进程在1ns后触发了事件a,那么第二个进程在1ns的时候等待a,有可能等的到,有可能等不到,产生竞争endinitial begin    #1;    wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的,这是和使用@来等待的区别end
例子2

https://blog.csdn.net/Michael177/article/details/120807670

triggered()函数,用于检测某个事件是否已被触发过,包括正在触发。线程可以等待这个结果,而不用在@操作符上xx。

代码语言:javascript代码运行次数:0运行复制
module event_test();  event a;  initial begin    #50;    ->a;    $display("Event a is being triggered!");  end    initial begin    #20;    wait(a.triggered);    $display("#20 a.triggered!");  end    initial begin    #50;    wait(a.triggered);    $display("#50 a.triggered!");  end    initial begin    #60;    wait(a.triggered);    $display("#60 a.triggered!");  endendmodule
parameter、interger、reg

https://blog.csdn.net/wuguozeng1989/article/details/46682125

1. integer类型的变量作为有符号数使用,而reg类型的变量则作为无符号数使用。

2. integer的位宽为字的位数,最小为32位

https://blog.csdn.net/qq_16923717/article/details/81067096

3. parameter是常量,不是变量,所以不允许在运行时修改它的值,即不能在组合逻辑或者时序逻辑中对其进行赋值。

竞争与冒险

https://blog.csdn.net/wordwarwordwar/article/details/79829130

信号由于经由不同路径传输达到某一汇合点的时间有先有后的现象,就称之为竞争,英文名Race;

由于竞争现象所引起的电路输出发生瞬间错误的现象,就称之为冒险,英文名Hazard或者Risk。

有竞争不一定有冒险,但出现了冒险就一定存在竞争。

解决方式:

1.引入封锁脉冲,锁存器

2.引入选通脉冲,稳定后选择

3.引入滤波电容。

4.修改逻辑设计。

https://blog.csdn.net/yc16032399/article/details/100126361

RS锁存器

https://blog.csdn.net/kewei168/article/details/101141511

真值表

R

S

Q

0

0

Q

0

1

1

1

0

0

1

1

X

当R=1时,S=0,输出为0,故R又称为直接置“0”端,或“复位”端当R=0时,S=1,输出为1,故S又称为直接置“1”端,或“置位”端当R=S=0时,输出保持不变(保证了RS同时为0(断电)后,电路输出能够保持不变)RS同时为1,若从同时为0的状态开始变化,则中间产生不定的输入状态01或10,产生不定的输出,不被使用。Makefile

Makefile拆分为两部分,进行逐个解释。

(1)第一部分如下

代码语言:javascript代码运行次数:0运行复制
CC=g++sources:=$(wildcard *.c) $(wildcard *.cpp)objects:=$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(sources)))dependence:=$(objects:.o=.d)all: $(objects)    $(CC) $(CPPFLAGS) $^ -o $@    @./$@  %.o: %.c    $(CC) $(CPPFLAGS) -c $< -o $@%.o: %.cpp    $(CC) $(CPPFLAGS) -c $< -o $@
代码语言:javascript代码运行次数:0运行复制
wildcard表示通配符,source则是整个文件夹中所有的c文件和h文件组成的变量。patsubst表示替换,%表示任意。首先将source变量中的所有cpp文件名转换为o文件名,然后再将修改后的变量中,所有的c文件名转换为o文件名,最后组成object变量。下一行的等号表示替换关系,将object中的所有.o文件名替换为.d文件名,组成了dependence文件名变量。make默认执行第一个规则,第一个规则名为all,其依赖了所有的object,即该文件夹下的所有.o文件。在执行该条语句前,应该先执行所有的.o对应的规则,当所有的.o的规则满足后,则执行编译过程。其中的$^表示了本条规则下所有依赖的文件名,$@表示本条编译规则名称,即all。当执行本条命令,则会生成一个名称为all的可执行文件。之后的@表示不显示执行的该条命令(当执行make时,所有执行的实际命令会在屏幕中进行打印)。 CC为编译器,使用=表示延迟生效的变量,使用:=表示立即生效的变量。延时生效的变量使用意义在于,随后对CC进行重新赋值后,以重新赋值的结果在整个Makefile中生效。%.o:%.c表示当前的文件夹下的每个.o文件方法,都依赖于每个对应的.c文件。然后执行生成过程。生成过程中,使用$<表示该方法依赖的文件中的第一个(因为有些时候依赖的内容不仅包括.c文件,还包括.h文件,.h文件一般不会写在第一个位置)。

(2)第二部分如下

代码语言:javascript代码运行次数:0运行复制
include $(dependence)  define gen_depset -e; rm -f $@; \$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@rm -f $@.$$$$endef%.d: %.c    $(gen_dep)%.d: %.cpp    $(gen_dep).PHONY: cleanclean:     rm -f all $(objects) $(dependence)echo:      @echo sources=$(sources)    @echo objects=$(objects)    @echo dependence=$(dependence)    @echo CPPFLAGS=$(CPPFLAGS)
代码语言:javascript代码运行次数:0运行复制
使用define和endef的宏定义,以gen_dep代表随后的4行命令。set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出,而不是继续向下执行。rm -rf $@表示删除生成的目标文件。 include表示引入外部文件,原理上类似于C语言中的.c文件。这里将所有的.d文件规则进行展开。写到这里而不是开头的原因在于,开头写的规则为默认规则,写到开头会覆盖默认规则。-M显示完整的c文件对头文件依赖关系,一般使用-MM显示不包含系统头文件的部分即可。>符号表示数据重定向符号,将数据重定向到$@.$$$$文件。在Makefile文件中,$表示变量的标记,使用$$则为真正的$符号。四个$转换为两个$符号,两个$符号表示进程的pid。因此数据会重定向到一个后缀为.pid的对应文件中。sed的替换命令中,使用逗号作为分隔符,s,g作为开头和结尾,中间添加逗号,进行行内替换操作。$*匹配%.d中的%表示的部分,即为规则目标使用通配符时,通配符表示的数据的第一部分。然后外部添加括号和.o,并添加数个空格和冒号,作为替换的源。该正则表达式分为三部分,以括号为第一部分,.o为第二部分,[ :]*为第三部分。在替换的目标中,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。替换的结果存储在目标文件中。sed将上一句生成的依赖关系中的一些部分进行了替换,写入到了每个先决条件文件下。替换的内容为:target.o : target.c *.h替换为:target.o target.d : target.c *.h。每个target.d文件的生成依赖于对应的target.c和*.h文件。当.d文件发生变化,则执行对应的make规则。即.d文件表达了替换名。随后的%d:%c以及%d:%cpp则对应执行了需要的命令。.d文件若是最新的,则.d对应的规则不会被执行。clean也是一样。当目录下存在一个为clean的文件,则对应的规则不会被执行。使用.PHONY可以去除这种效果,使得每次选择该条命令时必执行。后续的语句即为常规语句。


# c语言  # 工具  # qq  # ai  # 区别  # red  # JavaScript  # 数据类型  # Integer  # 常量  # if  # for  # while  # 循环  # 线程  # function  # 事件  # default  # input  # table  # https  # udp  # FPGA  # 第一个  # 不支持  # 第一部分  # 转换为  # 有可能  # 已被  # 重定向  # 非门  # 写到  # 即为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JS弹性运动实现方法分析  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  javascript基于原型链的继承及call和apply函数用法分析  Laravel如何实现事件和监听器?(Event & Listener实战)  微信小程序 wx.uploadFile无法上传解决办法  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Python结构化数据采集_字段抽取解析【教程】  使用Dockerfile构建java web环境  Laravel API资源类怎么用_Laravel API Resource数据转换  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  佛山企业网站制作公司有哪些,沟通100网上服务官网?  网站制作壁纸教程视频,电脑壁纸网站?  如何在Windows环境下新建FTP站点并设置权限?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何快速搭建高效简练网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在宝塔面板中创建新站点?  如何快速选择适合个人网站的云服务器配置?  iOS发送验证码倒计时应用  如何为不同团队 ID 动态生成多个独立按钮  如何用y主机助手快速搭建网站?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  长沙企业网站制作哪家好,长沙水业集团官方网站?  Swift中循环语句中的转移语句 break 和 continue  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何在万网ECS上快速搭建专属网站?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何处理CORS跨域请求?(配置示例)  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel观察者模式如何使用_Laravel Model Observer配置  javascript中闭包概念与用法深入理解  如何在香港服务器上快速搭建免备案网站?  原生JS实现图片轮播切换效果  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何自定义建站之星网站的导航菜单样式?  如何在阿里云购买域名并搭建网站?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何快速搭建二级域名独立网站?  详解Android图表 MPAndroidChart折线图