马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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语法问题。
|