【RTL】verilog表达式的位宽计算-续

📅 发布时间:2026/7/10 14:12:01 👁️ 浏览次数:
【RTL】verilog表达式的位宽计算-续
https://blog.csdn.net/tedrushin/article/details/137671105?spm1001.2014.3001.5501补充一些具体的判断规则结论放前面对于context-determined expression位宽取所有context-determinedexpression表达式除3的条件和LHS位宽的最大值self-determind expression的位宽只取决于自己 self-determind expression的结果对整体表达式的影响需要结合规则判断self-determind express内context-determined expression位宽扩展不会影响self-determind expression外表达式assignmemt判断位宽的流程参考原文EEE Standard Verilog® Hardware Description Language (IEEE Std 1364-2001)4.5.2和4.5.3章节该2章节实际上还是指向了4.4和4.5.1章节对于有符号数此处不讨论用得比较少读起来标准写的比较简单但一些复杂的场景不知道如何判断因此总结了一些规律。1. 对于context-determined expression取表达式和LHS位宽的最大值赋值assign操作等号左边位宽也需要考虑。举例加法规则ExpressionBit lengthCommentsi jmax(L(i),L(j))Context-determinedwire [2:0] a; assign a 2b11 1b1 //a 3b100 此处加法位宽被 左边3bit a扩展2. self-determind express的位宽只取决于自己 self-determind express的结果对整体表达式的影响需要结合规则判断举例1位移规则 表达式中self-determined的结果不会影响整体位宽ExpressionBit lengthCommentsi jL(i)j is self-determinedwire [1:0] a; assign a (2b10 2’b10) 1; //a 2b00进位丢失1是integer 默认32bit位宽表达式L(i)和j无关其实i的部分是context-determined,标准并没有明确指出2‘b10 2’b10 表达式本身和LHS都是2bit不会扩位宽因此结果为0右移结果为0wire [1:0] a; assign a (2b10 2’b10 0) 1; //a 2b10进位保留加0其实就是32‘b’0加法扩位宽变成100右移后获得2’b10这两个例子中self-determined j都是独立的举例2{}规则 表达式中self-determined的结果影响整体位宽ExpressionBit lengthComments{i,…,j}L(i)…L(j)Self-determinedwire [1:0] a; assign a (2b10 2’b10 {1‘b0,1’b0,1b0}) 1; //a 2b10进位保留{}内是是3bit的表达式因为加法规则是所有操作数的最大值所以扩位宽3. 一个context-determined expression位宽扩展后所有的context-determined expression位宽都会扩展除了self-determined内的举例1不在同一个表达式内的位宽扩展wire [1:0] a; assign a ((2b10 2’b10 0) 1) ((2b10 2’b10) 1); //a 2b0010保留进位 10保留进位 100保留进位 - 2b00截位第一个表达式因为 0而扩位宽因此保留进位第二个表达式也会跟着扩展位宽因此也保留进位相加之和因为a本身只有2bit被截位为2’b00举例2位宽扩展被自或规则self-determined“阻隔”ExpressionBit lengthComments|i1 bitSelf-determinedwire [1:0] a; assign a |((2b10 2’b10 0) 1) ((2b10 2’b10) 1); //a 2b011保留进位自或位宽为1 00不保留进位因为没有更大位宽的了 1