|  | 
 
 楼主|
发表于 2018-9-21 22:25:53
|
显示全部楼层 
| 回复 9# 13hope 
 > 个人理解,Verilog本身只是“建模”语言。
 
 
 Verilog是个大杂烩(中性,非贬义),包含了支持验证、综合、测试的语法结构,比如:initial, repeat, forever, task等。
 
 
 > 具体到阻塞/非阻塞,只规定了两种赋值语句的行为。所以无论怎么写,仿真器和综合器都不会报错。但是存在两个问题,所描述的行为是否有物理电路与之对应;电路行为在仿真阶段和综合后是否一致。
 
 
 感谢提醒,可能就是与综合后电路一致的原因。Verilog发展历经了好多个版本,有可能是历史原因。
 
 
 不过,最终要求的不是你建模的电路和综合后的电路一模一样,否则不是要写RTL代码,而是要画版图了。最终的要求是综合后的电路符合RTL描述的模型,行为一致。
 
 
 RTL是一个抽象的建模层次,而不是物理的建模层次,无法与综合后的电路完全对应:比如+-x÷这些operators都不是使用电路描述的,但综合后却有电路,怎么对应呢?
 
 
 还有综合器要对RTL的代码做优化,有一些电路不必要的会被优化掉,效率不高的会被优化成更高效的方式。
 
 
 再有,很多时候使用的是工具提供的库里面的模块,这个是黑盒的,也不清楚里面的电路。
 
 
 今天发现一个2001版本的新特性,可以佐证我的观点:
 ​​
 引自:https://www.cnblogs.com/tshell/p/3236476.html
 
 
 从这个里面可以看到,register不是物理的寄存器(DFF)。而是一个变量数据类型(variable data type).
 但是又遗留了明显针对物理寄存器的非阻塞赋值,做的不彻底。NBA增加了学习的难度,进而在使用中也会产生问题。
 
 
 建模方法(Modeling Methodology)应该尽量简单,把这部分工作放在综合器里面去做更合适。能写综合起的人,都是对电路特性更了解的人,出错的概率更小。
 
 
 RTL层建模需要的只是对变量赋值(variable assignment),甚至连 连续赋值 和 过程赋值 都不需要区分。这样的区分有助于理解,却不是必须。
 
 
 > 像是电平敏感always快内使用多个多个非阻塞赋值就没有意义,仿真结果不可信
 
 
 这个链接里有很多NBA在一个always块内:
 https://github.com/alexforencich/verilog-ethernet/blob/master/rtl/arp_64.v
 
 
 cache_query_request_ip_reg <= cache_query_request_ip_next;
 outgoing_eth_dest_mac_reg <= outgoing_eth_dest_mac_next;
 outgoing_arp_oper_reg <= outgoing_arp_oper_next;
 outgoing_arp_tha_reg <= outgoing_arp_tha_next;
 outgoing_arp_tpa_reg <= outgoing_arp_tpa_next;
 | 
 |