日常记录(6)Verilog

秒的换算

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
日常记录(6)Verilog

parameter、interger、reg

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

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

喵记多 喵记多

喵记多 – 自带助理的 AI 笔记

喵记多 27 查看详情 喵记多

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。

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

日常记录(6)Verilog
日常记录(6)Verilog

解决方式:

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

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

3.引入滤波电容。

日常记录(6)Verilog

4.修改逻辑设计。

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

日常记录(6)Verilog

RS锁存器

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

日常记录(6)Verilog

真值表

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可以去除这种效果,使得每次选择该条命令时必执行。后续的语句即为常规语句。

以上就是日常记录(6)Verilog的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/477919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 10:10:55
下一篇 2025年11月8日 10:11:58

相关推荐

  • python中numpy的用法

    NumPy是Python中用于科学计算的强大库,它提供了以下功能:多维数组处理矩阵运算快速傅里叶变换(FFT)线性代数随机数生成 NumPy在Python中的强大功能 NumPy是Python中用于科学计算的一个强大且灵活的库。它提供了用于处理多维数组和矩阵的一组高效工具,是数据分析和机器学习项目的…

    2025年12月13日
    000
  • pycharm可以写c语言吗

    是的,PyCharm 可以用来编写 C 语言。其支持 C 语言开发的功能包括:语法高亮和自动补全、代码导航、调试器、编译器集成和代码格式化。 PyCharm 是否可以编写 C 语言? 是的,PyCharm 可以编写 C 语言。 PyCharm 是一个强大的、跨平台的 Python 开发环境,但它也可…

    2025年12月13日
    000
  • pycharm怎么运行c语言

    在 PyCharm 中运行 C 语言代码的步骤如下:创建一个 C 项目。创建一个 C 文件。编写 C 代码。通过“运行”按钮或快捷键运行代码。查看“运行”工具窗口中的输出。 如何在 PyCharm 中运行 C 语言代码 要使用 PyCharm 运行 C 语言代码,请执行以下步骤: 1. 创建一个新项…

    2025年12月13日
    000
  • pycharm怎么创建c语言的文件

    如何在 PyCharm 中创建 C 语言文件:打开 PyCharm 并选择 “C Executable” 项目类型。在 “Project” 视图右键单击项目文件夹,选择 “New” > “File”…

    2025年12月13日
    000
  • pycharm怎么引入C语言库

    在 PyCharm 中引入 C 语言库可通过创建并编译 C 扩展模块实现:创建 Cython 文件并编写 C 代码。运行 “Run ‘setup.py’ build_ext –inplace” 编译模块。使用 import 导入模块并调用其…

    2025年12月13日
    000
  • Python中的多进程编程和多线程编程的区别是什么?

    Python中的多进程编程和多线程编程的区别是什么? 在Python中,多进程编程和多线程编程都是实现并行计算的方法。虽然它们都能同时运行多个任务,但其底层原理和使用方式却有所不同。 多进程编程是利用操作系统的多进程机制来实现并行计算的。在Python中,可以使用multiprocessing模块来…

    2025年12月13日
    000
  • Python中的迭代器和生成器的区别是什么?

    Python中的迭代器和生成器的区别是什么? 在Python编程中,迭代器(iterator)和生成器(generator)都是用于处理可迭代对象的工具。它们两者都可以用于遍历数据,但是在实现上却有一些不同之处。 迭代器是一个对象,它实现了迭代器协议(iterator protocol)。迭代器对象…

    2025年12月13日
    000
  • Python与PHP高效传递JSON数组:从多字符串到结构化解析实践

    本教程旨在解决python脚本向php返回多个json对象时,php端解析困难的问题。核心方案在于python脚本将所有独立的json数据聚合为一个列表,并统一序列化为单个json字符串输出。php接收该字符串后,通过两次`json_decode`操作,首先解析外部的json数组结构,然后遍历数组对…

    2025年12月13日
    000
  • php关联数组怎么增加一项_PHP向关联数组增加新键值对

    向PHP关联数组添加键值对有四种方法:一、方括号赋值(如$arr[‘city’]=’Beijing’);二、array_merge合并数组;三、+=运算符追加;四、array_push压入关联子数组(会改变结构)。 如果您需要向PHP关联数组中添加一个…

    2025年12月13日
    000
  • 利用OpenCart多店铺功能实现集中式站点管理

    opencart原生支持多店铺功能,允许在单一安装下管理多个独立的电子商务站点。这一特性彻底解决了在不同目录下部署多个opencart实例时面临的文件同步和维护难题,通过共享核心代码库和集中化后台管理,显著提升了多站点运营的效率与便捷性,避免了重复部署和手动更新的繁琐。 在管理多个电子商务网站时,尤…

    2025年12月13日
    000
  • php混淆加密怎么解密_用PHP反混淆工具还原混淆加密代码教程【技巧】

    首先识别混淆类型,如变量名替换、编码压缩或控制流扁平化;接着对编码内容手动解码,使用base64_decode或gzinflate还原;再利用PHP-Deobfuscator等工具自动反混淆;随后在隔离环境中动态执行捕获输出;最后结合php-parser进行语法树分析与人工重构,逐步恢复原始逻辑。 …

    2025年12月13日
    000
  • js读取php封装数组操作_前端获取php数组数据方法【指南】

    PHP数组传至前端JS需通过HTTP桥接,方法包括:一、JSON编码嵌入内联script;二、AJAX请求JSON接口;三、data属性注入;四、type=”application/json” script标签;五、隐藏input传递。 如果您在前端 JavaScript 中…

    2025年12月13日
    000
  • 解决PHP循环中大文件下载内存溢出问题

    在PHP循环中下载大量大型文件时,常见的`file_get_contents`和`file_put_contents`组合容易导致内存溢出。本文将深入探讨此问题的原因,并提供一个高效的解决方案,通过临时调整PHP内存限制来确保所有文件都能成功下载,同时保持代码的专业性和可维护性。 理解大文件下载中的…

    2025年12月13日
    000
  • 解决PHPMailer SMTP连接失败:端口587与TLS配置指南

    针对phpmailer在发送邮件时遇到的”smtp connect() failed”错误,本文详细阐述了在使用gmail smtp服务器、端口587进行tls加密连接时的正确配置方法。核心在于将`$mail->host`设置为纯主机名,并确保`$mail->sm…

    2025年12月13日
    000
  • php二维数组打印技巧_print_r与循环打印二维数组【方法】

    应使用print_r、var_dump、foreach嵌套循环、for循环或json_encode函数调试二维数组;print_r适合快速查看结构,var_dump显示数据类型,foreach可自定义格式,for循环适用于索引顺序处理,json_encode支持美化输出。 如果您需要在PHP开发中查…

    2025年12月13日
    000
  • php怎么调用数组中的数据库_php数组调用数据库数据循环查询法【技巧】

    PHP中从数据库获取数据并转为数组有五种方法:一、mysqli_fetch_array()逐行提取;二、mysqli_fetch_all()一次性获取二维数组;三、PDO fetch()逐行获取;四、PDO fetchAll()一次性加载全部数据;五、手动构建自定义键名一维数组。 如果您在PHP中需…

    2025年12月13日
    000
  • php数组查看是否存在索引_php检测数组键存在方法【指南】

    应使用array_key_exists()函数检测PHP数组键是否存在,它可准确判断任意类型键(含NULL值)是否存在于数组中并返回布尔值;isset()仅在键存在且值非NULL时返回true;key_exists()为已废弃别名,不推荐使用。 如果您需要判断PHP数组中某个键是否已存在,避免因访问…

    2025年12月13日
    000
  • php源码包怎么升级_php源码包升级步骤与兼容性处理【技巧】

    先备份当前PHP环境,再下载新版源码并解压,检查依赖后用原编译参数配置并编译安装,替换旧文件,重编第三方扩展,最后验证新版本功能与服务运行。 如果您正在运行基于PHP源码编译的环境,并希望将当前版本升级到更新的稳定版本,可能面临模块兼容性、配置迁移和扩展支持等问题。以下是完成PHP源码包升级的关键步…

    2025年12月13日
    000
  • PHP/MySQL多对多关系处理与安全动态表单数据插入指南

    本教程详细阐述了如何在php和mysql中高效且安全地管理多对多数据库关系。我们将通过学生选课系统为例,讲解如何设计中间表、从数据库动态生成html多选框,以及使用php处理表单提交。特别强调了利用mysqli预处理语句来防止sql注入攻击,确保数据交互的安全性与可靠性。 在现代Web应用开发中,处…

    2025年12月13日 好文分享
    000
  • PHP编码规范与最佳实践_PHP代码格式风格说明

    PHP编码规范的核心是统一、可读、可维护,强调命名清晰(如$userEmail)、4空格缩进、类型声明、外部输入过滤验证转义。 PHP编码规范的核心是统一、可读、可维护,不是追求绝对正确,而是让团队协作更顺畅、代码审查更高效、后续迭代更省力。 命名要清晰,别玩缩写梗 变量、函数、类名必须见名知意,避…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信