verilog的一些细节
初学verilog的刚知道还有可综合不可综合的时候,觉得可综合的verilog真是太简单了,用到的语法只有一点点,现在看看实在是孤陋寡闻了。今天了解到的新的东西总结一下:
- verilog-2001的RTL可综合标准可以参考文档 IEEE P1364.1 / D1.6 Draft Standard for Verilog(R) Register Transfer Level Synthesis,这个文档规定了综合工具对语法的支持;
- 线网类型除了wire之外还有tri,tri0,tri1,wand,wor,triand,trior,suppy0,supply1,其中:
-
- tri,tri0,tri1表示三态的线网(其实wire的z状态也可以表示高阻,当时对这个不在意可能是这个原因)tri0跟tri1分别是带下拉跟上拉电阻。其实上下拉电阻只在输入断开的时候起作用,这个设计中基本用不到,这个可能是对这个不在意的另一个原因。另,1364.1文档中说综合是不支持tri0跟tri1的;
- wand,wor,triand,trior,后半部分可以看出这个是带逻辑结果线型变量,也就是说是多输入的;
- supply0和supply1分别表示逻辑的0和1,是无输入的;
- 综合支持的编译指令有`default_nettype,`define,`undef,`include,‘ifdef, ‘else, ‘elsif, ‘endif, ‘ifndef,其中:
-
- `defalut_nettype后可跟tri,tri0,tri1,wand,wor,triand,trior,none,指示隐含的线网(模块的IO等)的默认类型,如果没有这条命令则默认为wire,如果选择none则有隐含的线网类型时会报错——这个其实蛮好的,可以做代码规范性检查;
- `define是支持参数的,跟C的带参数宏是一样的;
- interger其实是带符号的,不过verilog-2001中的wire和reg都已经是支持signed定义关键字了
ignorance is a rare blessing