0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

assign和signed的联合背刺事件

冬至子 来源:芯时代青年 作者:尼德兰的喵 2023-12-04 11:33 次阅读

没想到啊没想到啊,有一天会被浓眉大眼的assign背刺!想当年在always消失术里,在X态分析里,在xprop平替策略里,把assign捧的这么高,优点说了800多项,然后今天一仿真出bug了?!

还有有符号数和无符号数,我都吹出去了已经大成大成了,这还能出错?!

万事皆有可能,于是就出现了这个事。

事情的根源简化完就是下面这个语法,当sel为0时输出i_a高位补零的右移结果(相当于视i_a为无符号数),sel为1时输出i_a高位补符号位的输出结果相当于视i_a为有符号数):

//test
wire [31:0]i_a = 32'hff00_0000;
wire       sel = 1'b1;


wire [31:0]en0     = (sel == 1'b0) ? i_a > >> 8 : 
                                     $signed(i_a) > >> 8;

wire [31:0]en1_mid = $signed(i_a) > >> 8;
wire [31:0]en1     = (sel == 1'b0) ? i_a > >> 8 : en1_mid;

好,大家先看着这en0和en1的值。

en0和en1的值分别是啥呢?

图片

en0 = 32'h00ff_0000;

en1 = 32'hffff_0000;

问题出在哪呢?前面咱们总结过:有符号数和无符号数运算,结果为无符号数。这句话不太严谨,应该完善为:有符号数和无符号数运算,所有的运算数会被视为无符号数,结果为无符号数。

因为en0运算公式中,有符号数和无符号数混合运算了,有符号数和无符号数混合时会自动将所有的变量视为无符号数进行运算,而这个混合运算很难发现:

wire [31:0]en0     = (sel == 1'b0) ? i_a > >> 8 : $signed(i_a) > >> 8;

对,i_a >>> 8是个无符号数的运算!/(ㄒoㄒ)/~~所以带着signed(i_a) >>> 8也变成了无符号数的运算。所以说如果把signed(i_a) >>> 8单提出来先算好,再参与选择逻辑就是预期的结果了。

那么最后一个小问题,选择逻辑参与不参与这个有符号数和无符号数的争端呢?不参与,比如代码改成这样:

wire [31:0]en0     = (sel == 1'b0) ? $signed(i_a > >> 8) : $signed(i_a) > >> 8;

我把前面的运算结果通过$signed扩了一下,然后再仿真:

图片

这说明了两个问题:

1.选择逻辑没有参与到有符号数和无符号数的判定中;

2.判定时signed(i_a) >>> 8,看的是同一级别的其他运算项的符号属性,比如此时他看的是signed(...);

再改一下就又回去了:

wire [31:0]en0     = (sel == 1'b0) ? $signed(i_a > >> 8) + 1'b1 : $signed(i_a) > >> 8;

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    82993
收藏 人收藏

    评论

    相关推荐

    ALLEGRO画铜皮时可否自动ASSIGN NET

    在ALLEGRO中画SHAPE时需要再ASSIGN给它NET,这样感觉不太方便,而且ASSIGN NET需要在右键选项很下面,感觉效率很低。不知ALLEGRO中可否做到象PROTEL 那样,画铜皮到器件上时,能自动附上网络属性呢?这样我就可以省很多时间了咯。
    发表于 03-31 06:52

    assign赋值问题请教

    wire [7:0]C;reg A;regB;assign C={B,A} == 2'b01 ? 1'b1:1'b0;这句话怎么理解?是C的低两位是B和A的值不?和后面的三目判断没有关系?
    发表于 05-03 10:28

    typedef volatile signed short什么意思

    typedef volatile signed short什么意思,求求
    发表于 07-18 11:58

    wire 和 assign的 区别 ---求助

    regrst_nr2;wirelocked; (1)wire sysrst_nr0= rst_nr2 & locked; (2)assign sysrst_nr0= rst_nr2 & locked;上面 两个赋值 一样吗,有区别吗
    发表于 02-20 10:59

    快点PCB原创∣来聊个两毛钱的钻~~

    大家换换下饭菜,讲讲加工工艺--钻。钻英文名为Backdrill或Backdrilling,也称CounterBore或CounterBoring。 钻技术就是利用控深钻孔方法,采用二次钻孔方式
    发表于 08-31 11:19

    转:PCB加工工艺--

    钻英文名为Backdrill或Backdrilling,也称CounterBore或CounterBoring。钻技术就是利用控深钻孔方法,采用二次钻孔方式钻掉连接器过孔或者信号过孔的stub孔
    发表于 08-31 14:31

    快点PCB原创∣来聊个两毛钱的钻~~

    快点PCB原创∣来聊个两毛钱的钻~~前面几期郭大侠教给大家的都是软件使用技巧,估计同学们口味有点腻了。也是,有端正优雅的吴敏霞,也会有洪荒之力的傅园慧。今天,快点PCB大神郭大侠(PCB设计
    发表于 09-21 15:15

    高效率苹果夹方案

    `KF827苹果夹方案采用了ETA6085移动电源SOC,开关型充电,5V同步升压,高达2.4A的充电电流以及2.1A的升压放电输出能力。转换效率高达95%,发热量小。锂电池保护芯片采用
    发表于 06-12 20:19

    signaltap II综合assign语句的问题

    直接将输入到FPGA的晶振时钟信号clk,利用语句assign clk_out = clk将其输出给其他的IC使用,在用signaltap II仿真的时候,看不到clk_out的波形(一直为低电平)。请问一下,这是什么原因?
    发表于 08-10 14:55

    资料下载:HDL中的unsigned与signed

    unsigned与signed:想必大家在C语言是经常用到,可不知HDL语言中的unsigned与signed是否常用罗!其含义与C语言中的意思无异,区别主要是取值范围。unsigned
    发表于 07-02 07:59

    注塑成型工艺中的压到底有多重要?适当调校压的好处有哪些?

    压是什么?压是如何形成的?注塑成型工艺中的压到底有多重要?适当调校压的好处有哪些?过高的压易出现哪些问题?如何去调校注塑
    发表于 07-13 08:38

    HDL语言中的unsigned与signed的主要区别是什么

    unsigned是什么意思?signed是什么意思?HDL语言中的unsigned与signed的主要区别是什么?
    发表于 09-24 07:02

    嵌入式必总结资料

    标题:全国计算机三级嵌入式必总结资料我自己就是把这个资料了就一次过了:资料链接国家计算机嵌入式考试每年考的基本都差不多,尤其是选择填空,大题都是非常简单的,看看视频就能知道类型也相同,不过
    发表于 10-27 07:22

    assign语句出错。

    就是一个普通的assign语句:conv1_mem_wr_enn是wire类型,conv1_mem_wr_en是reg类型,但是当conv1_mem_wr_en有值的时候,conv1_mem_wr_enn却没有值。
    发表于 12-03 21:04

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always语句用于时序逻辑建模。本文将详细探讨这两种语句
    的头像 发表于 02-22 16:24 485次阅读