在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2503|回复: 1

[原创] Systemverilog语法问题分析——BNF使用方法

[复制链接]
发表于 2020-11-5 22:37:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x

前言
在使用systemverilog过程中,必然会遇到一些编译问题。当然,对于大部分编译问题,只要用户能认真品读编译器给的提示信息,那一般都能理解出错原因并修改通过;但除此以外,也难免遇到一些通过编译器的提示信息,依然不懂如何修改的情况。
这个时候,用户可以通过try一些语法来尝试,这也是一般场景下用的最多的方式。本文在此以外,提供另一种更正统的方式——阅读systemverilog的语法范式BNF来进行解决。
BNF本身比较简单,学习门槛很低。通过对本文的学习,希望读者能掌握解决systemverilog语法问题的通用办法,借此精通掌握systemverilog语法。
BNF介绍什么是BNF?
巴科斯范式:以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。(元语言:用来谈论、观察和分析另一种语言的符号语言)
实际上,编译器之所以能编译一种语言,原因也在于它用这种语法的BNF来分解那种语言的字符流,如果不满足BNF,就以此为依据来上报告警。

BNF使用方法
BNF使用方法在《IEEE Standard for Systemverilog》中已经描述得很清楚,这里仅做一些翻译。
The formal syntax of SystemVerilog is describedusing Backus-Naur Form (BNF). The syntax of System-Verilog HDL source isderived from the starting symbol source_text. The syntax of a library map fileis derived from the starting symbol library_text. The conventions used are asfollows:
SV的语法范式采用巴科斯范式
SV源代码的语法源自起始符source_text
库映射文件的语法源自起始符library_text
采用的约定如下:
            — Keywordsand punctuation are in bold-red text.关键词和标点用红色粗体
            — Syntactic categoriesare named in nonbold text.语法类别以非粗体命名
            — A verticalbar ( | ) separatesalternatives.竖线(|)分隔替代项
            — Squarebrackets ( [ ] ) encloseoptional items.方括号([])包含可选项目
            — Braces ( { } ) encloseitems that can be repeated zero or more times.大括号({})包含可以重复零次或多次的项目。
作为元语言,我们需要记得只有这些就足够了,下一章我们根据我们的例子来说明即可。
例说用BNF解决SV传参问题传参例子说明
假设有如下代码:

                               
登录/注册后可看大图
示例代码可能为了增加代码灵活性,这里的pkt_monitor代码需要有个OUTPORT_NUM作为参数。但当pkt_monitor被其他类进行传参例化后,如:

                               
登录/注册后可看大图
编译器会上报类似如下告警:
Warning:Attempingto override a parameter not find in the class.
即编译器认为有人尝试覆盖一个并不存在的参数。这确实是让人非常费解的一个编译提示,因为对于不知情的用户来说,parameter OUTPORT_NUM就明明白白地躺在那里,为什么编译器会不认识?
BNF解析过程说明
由于我们笃定module下这种方式绝对是可行的,因此我们此时通过查找《IEEE Standard for Systemverilog》,找到带参数的class的使用范式是怎样的。



                               
登录/注册后可看大图
可见疑点有二:一处是parameter_port_list,因为明显根据BNF这里可以定义parameter;一处是class_item,因为当前我们的parameter就定义在这个位置。
此时,用户可以在文中搜索上面两个关键词来进一步展开其说明。
搜索可以parameter_port_list,可以得到如下内容

                               
登录/注册后可看大图
进一步继续展开list_of_param_assignments,注意,从这里也可以看到为什么最后一个参数后面是没有逗号的。

                               
登录/注册后可看大图
再继续追param_assignment

                               
登录/注册后可看大图
至此,就已经把parameter的书写方法说明白了。过程中省去了一些别的分支条件,感兴趣的读者可以自行追,一定能找到满意的答案。
但至此只说明了参数应该怎么定义,那为什么放在class_item中就是错的呢?同理,我们打开class_item来看看。

                               
登录/注册后可看大图
这里的parameter_declaration有特别注释如下:

                               
登录/注册后可看大图
就是parameter_declartion如果是掖在class_item里,那parameter就等价于localparam。而localparam代表的是这个参数只在本类里面可见,不开放给外部用户,所以编译器在编译时认为这是个localparam,因此不给override。
至此,已经通过BNF解决了一个传参的小问题,以此类推,用户只要掌握BNF的这套查找使用规则,就可以定位出所有systemverilog语法问题。

发表于 2020-11-6 09:48:39 来自手机 | 显示全部楼层
阅读巴斯科范式描述确实有些不适,但对照范式和实际语法描述例子可以很容易理解的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-14 18:56 , Processed in 0.014524 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表