ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Verilog】表达式位宽与符号判断机制

2021-10-23 18:34:39  阅读:304  来源: 互联网

标签:ALUOp 操作数 符号 signed Verilog d5 表达式


缘起于p1课下alu算数位移设计。查了好多资料,最后发现还是主要在翻译官方文档。浪费了超多时间啊,感觉还是没搞透,还是先以应用为导向放一放,且用且归纳

1.表达式位宽 expression bit length

身为硬件描述语言,Verilog表达式运算过程中必然要严肃考虑位宽问题

表达式的位宽由式中操作数和语境决定

表达式按位宽确定方式分为两类:

  • self-determined expression
    位宽仅有表达式自身确定,不会受语境影响也不影响语境中其他表达式(在复合表达式中某些位置上的子表达式,如i>>j中的表达式ji?j:k中的表达式i)。
  • context-determined expression
    位宽由表达式本身和其所属表达式(父子表达式)共同决定(如阻塞赋值操作的RHS位宽由其自身和LHS被赋值变量的位宽决定)。

下表中i,j,k表示"单操作数表达式",L(i)表示表达式i的位宽

截自verilog-std-1364-2005

有些根本性的理解不是很到位

例1:所谓中间值位宽

例2:三元运算符表达式位宽

例3:综合由语境决定位宽

2.表达式符号性 expression signedness

Verilog计算表达式前,需要确定表达式的符号性,规则如下:

  • 仅取决于RHS操作数,与LHS无关(与位宽确定有别,如assign a = b ? c : d;中LHS符号性与a自身无关)
  • 十进制数视为signed
  • 进制表示数视为unsigned,除非使用进制前加s特殊标明(4'd3无符号,4'sd3无符号)
  • 位选择(不论是否选全)、位拼接(不论操作数)结果视为unsigned
  • 比较表达式结果视为unsigned
  • 实数强转整形表达式结果视为signed
  • self-determined expression:符号性取决于其中操作数
  • context-determined expression:
    • 若存在操作数为real,则结果视为real
      • 若存在操作数为unsigned,则结果视为unsigned
      • 若所有操作数为signed,则结果视为signed
  • 变量本身是unsigned(不过存了01串罢了,不要因为reg [3:0]a = 2'sb11就认为变量a是signed),除非声明时附加关键字signed

确定整个表达式的符号性后,便会向内层表达式传递符号性,直至各操作数。
$signed(exp)函数计算传入的exp并返回与其值和位宽均相同的数据,将其符号性改为signed。可以看作屏蔽了外部表达式的符号性传递。

例:含三元运算符的表达式

testbench中使ALUop恒为3'd5A=4'b1101

input [3:0] A,
input [3:0] B,
input [2:0] ALUOp,
output [3:0] C

 

assgin C = (ALUOp == 3'd5) ? A >>> B : 4'sd0;

分析
在三元运算符(ALUop == 3'd5)属于self-determined表达式,不会影响符号性判断。因而看后半部分。4'sd0为符号数;A >>> B表达式中B为self-determined表达式(操作数),所以符号性仅看AA无符号,因而总表达式RHS无符号。

传递符号性后,A无符号数经算数位移值为4'b0110,再赋给C

 

assgin C = (ALUOp == 3'd5) ? $signed(A) >>> B : 4'sd0;

分析
$signed()使$signed(A)表达式有符号,则$signed(A) >>> B表达式有符号,则总表达式RHS有符号。

传递符号性后,$signed(A)A相当于被$signed()隔绝,仍无符号)被视为有符号数,算数位移后值为4'b1110

 

assgin C = (ALUOp == 3'd4) ? A + B :
           (ALUOp == 3'd5) ? $signed(A) >>> B : 4'sd0 ;

分析
嵌套式三元运算符的结构。A + B表达式无符号(其中中AB无符号),因而总表达式RHS无符号。

传递符号性:(ALUOp == 3'd5) ? $signed(A) >>> B : 4'sd0无符号;$signed(A) >>> B无符号;$signed(A)无符号(A$signed()保护),算数位移后值为4'b0110

 

assgin C = (ALUOp == 3'd4) ? A + B :
           (ALUOp == 3'd5) ? $signed($signed(A) >>> B) : 4'sd0 ;

分析
同上,总表达式RHS无符号。

传递符号性:(ALUOp == 3'd5) ? $signed(A) >>> B : 4'sd0无符号;$signed($signed(A) >>> B)无符号。$signed(A) >>> B被保护,因而$signed(A)仍视为有符号,算数位移后值为4'b1110

标签:ALUOp,操作数,符号,signed,Verilog,d5,表达式
来源: https://www.cnblogs.com/elucidator-xrb/p/15449144.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有