请选择 进入手机版 | 继续访问电脑版

明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 490790|回复: 0

VERILOG语法问题【汇总贴】

[复制链接]

35

主题

57

帖子

6965

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6965

荣誉管理论坛元老

QQ
发表于 2020-4-9 11:53:22 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
温馨提示:明德扬2023推出了全新课程——逻辑设计基本功修炼课,降低学习FPGA门槛的同时,增加了学习的趣味性,并组织了考试赢积分活动
(点击→了解课程详情)http://www.mdy-edu.com/ffkc/415.html感兴趣请联系易老师:13112063618(微信同步)



Verilog知识点参考:书籍《FPGA至简设计原理与应用》第一篇FPGA基础知识第三章硬件描述语言Verilog


【问题0】:关于阻塞赋值“=”和非阻塞赋值“<=”的讨论。

答:请看此帖子:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=932


【问题1】:关于 data[31 -cnt0*8 -:8]的含义。
答:MDY常用的数据选择语句  http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=937


【问题2】:关于数组的含义,即reg[7:0]  data[3:0]的含义。

答:Verilog中数组的表示 http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=946


【问题3】:VERILOG中正负数、小数的表示方法。
答:FPGA中正负数和定点小数的表示方法  http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=771


【问题4】:在设计文件中,如何确定信号是什么类型的?
答:【技巧分享】在设计文件中,如何确定信号是reg型还是wire型?http://fpgabbs.com/forum.php?mod ... =621&fromuid=100110
        另外,对于没有定义的信号,默认为1比特wire型。


【问题5】:我设计了一个模块,并且模块命名为latch,为什么软件会提示错误。

答:latch是VERILOG关键词,不能用于自己设计的模块命名或者信号名。所以要注意关键词。


【问题6:ALWAYS不写ESLE表示保持原来的值】:下面是一个ALWAYS语句,当rst_n==1、a==1时,led的值是多少?
TIM图片20200506164808.png
回复:当rst_n==1,a==1时,上图中第3、第6和第9行都不满足条件,因此第4、7、10行的赋值语句都不会执行。也就是说led值没有改变。
         所以,时钟上升沿之后,led还会保持原来的值。如果原来的led等于0,之后也是0;原来等于1,之后也是等于1.


【问题7】左移和右移,空出的位置是补0吗?

答:是的。左移就是低位补0,右移就是高位补0。



【问题8】为啥begin后面加这个冒号,以前没见到过。

微信图片_20200807112226.jpg

答:begin后面加冒号,相当于这个begin end块起一个名字。起名字是做区分用,一般情况下,不对begin/end命名,所以这种写法很少见。


【问题9】在verilog中到底应不应该用for循环?
答:在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。在Verilog中除了在Testbench中使用for语句外,在RTL级编码中是却很少使用for循环语句。主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效的复用逻辑资源,造成巨大的资源浪费。简单来说:for循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。


【问题10】在Verilog中想要给一个信号赋值的位宽是可变的,应该怎么做?
答:可以使用下面这个赋值方法:{WID{1'b1}}举例:din <= {WID{1'b1}},当WID为8的时候,din <= 8'b1111_1111
      通过修改WID的值,可使赋值的位宽发生变化。


【问题11】data[b+7:b]<=rx[a+7:a]老师我想用for循环动态给data的区间赋值,但是报错说b不是常量怎么办?
答:verilog中不支持位宽选择时 上边界和下边界均为变量。另外:不要用软件的思维来做FPGA设计


【问题12】提示endmodule语法错误?这个能有什么错误呢?如下图:
32.jpg
答:像这种提示哪几种错误的,就打开代码,找到这一行,前前后后,检查代码有哪些与“平常”不一样的地方。如果 清楚,可以打开一个已经OK的代码,来代码下。


【问题13】请问以下变量后加个"-"意思是取这个变量的某几位吗?
9.JPG
答:上面的按减号带入结果就可以了,例如 data[7-1],就是data[6]。 data[7-1:0],就是data[6:0]。


【问题14】问能不能在适中的下降沿采集数据呢,比如写成always@(negedge clk)
答:整体系统中,建议都使用时钟上升沿,不要使用下降沿,否则不符合设计规范,造成系统的不稳定。
      FPGA系统会对全部路径进行路径分析,会计算两个D触发器之间的延时,确保这个时钟上升沿发出的数据,在下一个时钟上升沿能采到。
      假如上升沿发数据,下降沿来采集(或者下降沿发数据,上升沿采集),相当于时钟周期减半了,时序要求更高了。


【问题15】二进制000-二进制001=111  这个最高位怎么算的?

答:参考十进制加减的运算方法,如下图所示得到的。
TIM图片20200903181254.png
所不同的是:二进制是 0-0=0,0-1=1,1-0=1,1-1=0。
如果保存结果的位宽只保留最低位的话,那就是111。
更多更详细的资料,请看《FPGA至简设计原理与应用》:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989,请看第一篇,第三章5.3 算术运算符的内容。


【问题16】rst_n==1'b0 和!rst_n不同的问题。

111.jpg 112.jpg
LED灯设计为什么LED和计数器复位条件不一样?
答:这两个结果是一样的,都是当rst_n为1时复位。只是写法不同。


【问题17】请问各位老师同学 如何用modelsim获取一段代码的运行时间? 谢谢

答:verilog是硬件描述语言,不是软件。一般情况下,硬件的运行速度仅取决于系统时钟频率。但随着时钟频率的提高,关键路径成为制约硬件速度的瓶颈。至于最高速度,要基于具体的工艺库,并用DC、PT等专业软件做静态时序分析才能得出来。


【问题18】a[0:0]表示什么意思呢?
答:就是a[0]的意思


【问题19】data[0] <= data_b [0][2]表示什么意思?

答:将data_b看作一个矩阵,表示调用矩阵的第0行第2个数据。


【问题20:一个always里有多少信号时的理解问题】如下图所示,第9行代码里的key_reg值,是等于第8行的key的值还是key_reg的值。是先执行第8行,再执行第9行代码吗?

微信图片_20200911210716.png
答:当一个always里设计了多个信号时,如上图中设计了key_reg和delay_cnt的值,其实质可拆分成如下代码。
微信图片_20200911210724.png
而众所周知,verilog代码中每个always都是独立并且同时执行的。
因此上图中第23行的代码和第32行的判断是同时进行的。假设当前key_reg等于0。在时钟上升沿前key等于1。那么第23行执行后,key_reg值更新为1。同时第32行判断时key_reg值仍然为0,不是最新的值为1。
在此,MDY强烈建议,一个ALWAYS设计一个信号,有助于做逻辑设计,理清思路,避免很多理解上的问题。
而且事实上,一个always设计多个信号更像写“软件”的代码,是用软件思维在设计FPGA,而在FPAG中是不规范的。


【问题21】 always 语句中,不论是赋值 还是 比较,都是针对 时钟上升沿到来前的  前面一点点时刻的 寄存器中的数据 来赋值 和 比较的。

答:是的。具体请看下面的波形图规则 :http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1006


【问题22】问一下关于敏感信号的事情,任何信号都可以被当作敏感信号吗?也就是always模块里面:always @(posedge din_vld or negedge rst_n)begin这样写可以吗?
答:语法上是可以的,但不符合FPGA和ASIC的设计规范。一般这个是写时钟和复位信号。不规范的话,会造成系统的不稳定


【问题23】复位信号必须要放到敏感信号列表吗?
答:异步复位需要将复位信号加到敏感列表,同步信号不需要


【问题24】多个模块的输出信号,可以连到一起,共同驱动另一个模块吗?
答:遇到此问题,可以稍微推理一下就能清楚了。例如模块A有一个输出信号a,模块B有一个输出信号b,然后这两个信号连在一起(怎么做的不清楚,先假充有这种情况),
      共同均有一个模块C的输入信号c。那么存在这种情况,模块A要输出1,模块B要输出0给模块C,那么模块C收到的是0还是1呢?这种情况下,模块C就不清楚收到什么了。
      所以本题答案:两个模块的输出信号不能连在一起。


【问题25】组合逻辑电路可以有反馈吗?
答:组合逻辑不可以有反馈的。组合逻辑根据当前输入得到输出,而这个输出信号不能与输入相连,如果相连了,那么输出的值就不确定了。

【问题26】写的代码太复杂/未遇到的语法,不理解/,代码不知道哪里错了/等问题
答:FPGA的代码格式都是非常简单的,不推荐也不建议使用复杂的语法。如果使用了使用语法,又出错时,有如下建议
     1. 将复杂代码,使用简单代码代替。
     2. 或者,将代码分解,每添加一行看不行结果,以方便定位哪里有问题。


【问题27】什么时候使用组合逻辑,什么时候使用时序逻辑?
答:请看此篇文章,有详细解释:http://www.mdy-edu.com/wentijieda/20210410/1322.html


【问题28】VERILOG语法中,signed类型的作用。
答:1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?
2.verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。比如a/b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩位成5位,
然后按照无符号加法进行相加。a/b没有被signed修饰的时候会按照无符号数的扩位方式进行扩位,即高位补0,加法的结果当然也是a、b为无符号数相加的结果。
3.如果想把a、b作为有符号数来相加,那么就得在a/b数据定义的时候用signed修改,或者在计算的时候用$signed()来修饰,这样在c = a + b,这个运算开始的扩位就会按照有符号数的方式进     
行扩位,在高位补符号位,加法得出的结果就是a、b视为有符号数的结果。当然c要视为有符号数据。
https://www.cnblogs.com/yuandonghua/p/signed.html


【问题29】VERILOG中定义的类型,是怎么分辨是有符号数、无符号数、或者16进制数的。

      答:要真正理解一点,FPGA的信号,其本质上是二进制数。例如4'b1010。至于这个二进制数,是有符号数,还是无符号数,都是取决于工程师的解释。例如4'b1010,可以理解为无符号数10,也可以 理解为有符号数原码-2,              也可以理解为有符号数补码-6。更多解释,请看《FPGA至简原理与应用》一书中关于verilog和补码由来这一部分:http://www.mdy-edu.com/zhijian/2021/0409/1239.html


【问题30】在FPGA计算中,对于a+b等,对a和b是根据无符号数,还是有符号数来计算的?
答:再次强调,真正理解:FPGA信号本质是二进制数,无论a和b是什么类型的信号,最终都是换算成二进制来计算,自然的遵守二进制计算基本法则,


【问题31】请问generate的使用方法
答:可以参考如下文章:07 generate语法http://www.mdy-edu.com/wentijieda/20210410/1323.html(出处: 明德扬论坛)


【问题32】请问信号定义时,输出类型的定义和信号类型的定义可以放到一起写吗?
答:可以的,举例:  output   reg    [7:0] dout;


【问题33】len <= {len[7:0],din},len信号的位宽为16bit,din的位宽为8bit,这段代码的意思是什么?
答:举例说明,假设din需要传输的数据为8’h55和8‘hd5,len初始为16’h0,则第一次进行赋值时,len[7:0]为8‘h0,din为8’h55,拼接之后赋值给len,此时len=16‘h0055;
      第二次进行赋值时,len[7:0]为8’h55,din为8‘hd5,拼接之后赋值给len。此时len=16’h55d5。


【问题34】红色箭头指的那些语句是什么意思?

答:这是宏定义的的一种用法。此时表示该.v文件使用的是从“ 'ifndef SIMPLE”到“ 'endif”的代码,如果把“' define SIMPLE”注释掉的话,使用的就是除“ 'ifndef SIMPLE”到“ 'endif”以外的代码。


问题35】好多个模块是只编译顶层模块就可以了吗?

答:无论是仿真还是综合,其综合都是从顶层模块开始的。通过调用顶层模块,然后根据顶层模块的例化代码,就能找到下一层模块,逐级找下去,就能找到所有使用到的模块了


【问题36】fpga乘法可以直接用*吗?
答:可以的.加法器 、减法器和乘法器是可以直接使用的,除法器由于占用资源比较大,不建议直接使用


【问题37】问:例化的时候,如果对接口留空是什么结果
答:例化的时候,如果是模块的输入信号,留空的话表示输入0。如果是输出信号,留空的话,没有影响。


【问题38】这个4bit MCU_FSMC_data[0],  拼接  有简单的写法吗?

答:data_4 <= {4{MCU_FSMC_data[0]}};


【问题39】这是明德杨语法课的一段代码,左边的写法为什么是错误的呀?
钉钉网络班.jpg
答:那是软件思维,软件思维就是先执行第1行,再执行第2行;右边是硬件思维,在描述b信号的功能。


【问题40】ALWAYS里的 if  else是否有优化级?是按顺序判断的吗?
答:是否理解“else”的意思?中文含义是叫“否则”,否则是指一个条件的否则。也就是说前面条件不满足,然后再看此条件。
      所以不用纠结于“顺序执行”、“优先级”概念,就按字面上的意思来理解就对了


【问题41】代码中,“if(0)”是什么含义?如下图。
微信图片_20210406134706.png
答:verilog里面,if是条件判断语句,如果括号里为真,则执行,则假则不执行。if(0),括号里条件是假,所以不执行。
      因此上面代码中,条件写成if(0)就是表示永远不执行的意思。
      有人好奇为什么这么写?这不是毫无意义吗?嗯,具体原因可以问作者,可能是前期代码要用到,后期发现不用了,又懒得改太多,就写成0吧。


【问题42】FULL和是A_WIDTH都是parameter,FULL[A_WIDTH]是什么表达方式呢?
答: []在VERILOG里用于表示第几比特,例如a[0]表示a的比特0位,a[1]表示a的比特1位。程序里(包括verilog或者c语言)不管定义成什么类型,其最本质的就是二进制数。
        使用parameter定义了FULL和A_WIDTH,其也是二进制数,所以FULL[A_WIDTH],自然就是FULL的比特A_WIDTH位。


【问题43】always那个括号里面的*号代表什么意思?

答:加“*”是组合逻辑的写法。当敏感信号非常多时很容易就会把敏感信号遗漏,为避免这种情况可以用“*”来代替。这个“*”是指“程序语句”中所有的条件信号,即 a,b,d,sel (不包括c),也推荐这种写法。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-3-29 03:47 , Processed in 0.060831 second(s), 24 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表