其实绝大多数基于命令行命令来设计的语言都相对丑陋。
比如 bash,又比如 vimscript 。
但是他们设计得那么丑陋本质上是有原因的。
因为要想方便命令行输入,就必然会存在很多妥协。
这两种设计不可调和。
即:
比如微软的 PowerShell 就是为编程优化的语言,所以它作为命令行输入使用时非常糟糕,而 bash 就是作为命令行输入时非常好用的语言,但它作为编程语言就很糟糕。
所以,如果说一个编程语言丑,但又丑得有意义,有实用价值,有充分理由让它必须保持这个丑的样子,那我觉得,就是那些面向命令行输入优化的语言了。
至于那些为了丑而丑,却没有获得额外实用价值的编程语言,我甚至是没有兴趣去记住他们。
VerilogHDL。
语法糖极少。
对于状态很多的状态机没有较好的语法糖维护复杂状态,某些情况下,例如端口列表的末尾不允许有多余的逗号(就像 json 一样),导致复制粘贴很麻烦。还有像 top 模块通常都是子模块互联,那么子模块之间有多少条连线就要声明多少个 wire ,即使这些 wire 仅仅在互联期间使用过一次。对于模块中一些关键的 port,没有相关语法糖能够标注一个 port 在没有被连入的情况下强制报 error 或者 warning,这些语法糖的缺失导致 verilog 代码通常在开发的中间阶段维护代码很麻烦。
verilog里面要写无数个三目运算符,也就是?:这个运算符,这个语法在老的C语言代码中很常见,但是最近大家应该都很少见到了,因为可读性很差,很多软件公司明令禁止这种写法,要求即使很简单的条件分支都必须使用if else;但是相反,在硬件行业中这种写法随处可见,并且还被鼓励使用三目运算符替代if else,原因是电路中有一种情况叫做 1'bx,也就是不定态信号,使用 if else 和 case 都不会将该不定态传播到下一级电路,导致会有一些隐性 BUG 出现。但是 assign 连续赋值看起来会非常难以理解,也就是如果想要用VerilogHDL写出优化措施非常到位的代码,必须要牺牲很多可读性良好的代码写法。
并且VerilogHDL还有一个很奇葩的规定就是always(*)语句块中必须为reg,但是事实上always(*)配合<=并行赋值语句这种写法其实内部是纯组合逻辑,根本不存在寄存器,这一点从语义上来说就讲不通。在 SystemVerilog 中则使用了 always_ff 和 always_comb 来解决这个问题。
其实Synplify Pro这种商用综合器会提供注释hint的方式提示综合器进行特殊优化,但是这种优化本身就让VerilogHDL代码产生了不一致性和不确定性,硬件开发本来是一个需要比软件开发更加具有确定性和一致性,但是VerilogHDL因为语言本身的设计问题,导致这两个特性无法体现出来。
同样是Verilog2001标准,但是对于综合器细节行为约束性不强,不同的EDA工具(综合器)会有不同的行为。例如没有接入点端口是初始化为0(低电平接地)还是为z(高阻)还是x(未定义),这个各家eda的行为不一致,还有一个module里面的一堆port声明末尾是否可以有冗余的逗号,`include宏引入的相对路径(没错,我说的就是intel自家的quartus和modelsim,针对这两种情况的解读都不一样,我认为这种行为应该由VerilogHDL本身限制,而不是交给EDA工具自由发挥,毕竟硬件代码的容错性和要比软件代码低得多,对准确性和行为一致性要求极高)
`timescale仿真居然可以每个文件写不一样的时间单位,这对IC验证极其不友好。
目前各家EDA软件对于VerilogHDL这门语言也没有提供非常好的代码编辑器,写起来及其麻烦。大家可以类比一下Java,Java虽然也是一门极其繁杂的语言(想一想java里面要声明一个泛型很复杂的hashmap对象是不是要写很长的语句?),但是Java有eclipse啊,有idea啊,虽然冗长但是人家在ide里面只需要打几个缩写然后tab,或者按点然后回车就好了,而verilog呢,本身为了严谨性要写那么精确冗长的语句可以理解,但是如果有一款和idea差不多级别的代码编辑器,那么开发效率肯定可以提升很多。(比如实例化module的时候自动提示parameter和port的名字,bus宽度,数据类型,有无符号,io方向等,已经2021年了,这种在编程语言里面属于最基础的代码提示,都没看到哪家编辑器提供了支持。)
幸运的是,后来推出的SystemVerilog已经解决很多VerilogHDL的问题,我现在大部分场合都使用SystemVerilog直接写可综合的RTL代码和验证代码。听说ARM等大厂也已经全面使用SystemVerilog替代VerilogHDL了。但是上面说的并行选择和独热码的语法糖仍然没有在SystemVerilog中看到。如果要在HDL中写一些优化代码,仍然挺麻烦的。
2006-01-02 15:04:05
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有