无符号整数除法器:16位除8位
无符号整数除法器:16位除8位
备注:在写testbench时发现reg型变量是有符号的补码形式。使用{$random}%b产生无符号随机数,除数被除数依旧可能取值为负数;然后手动输入大于2^7=128的数作为除数,发现发生溢出,除数被当作负数,这才发现此时reg型变量应该是被当作了有符号数的补码形式。一般认为reg型变量为无符号型变量,有出入,特此记录。
源代码
//unsigned 16bit/8bit
module unsignediv(divee,divor,result,odd);
input [15:0] divee;
input [7:0] divor;
output [15:0]result;
output [15:0]odd;reg [15:0] result,odd;
reg [15:0] tempa;
reg [7:0] tempb;
reg [31:0] temp_a,temp_b;
integer i;always @ (divee or divor)
begintempa=divee;tempb=divor;temp_a={16'h0000,tempa};temp_b={tempb,16'h0000};for(i=0;i<16;i=i+1)begintemp_a={temp_a[30:0],1'b0};if(temp_a[31:16]>=tempb)temp_a=temp_a-temp_b+1'b1;else temp_a=temp_a;endresult=temp_a[15:0];odd=temp_a[31:16];
endendmodule
测试代码
module unsigned_tb;
reg [15:0] divee;
reg [7:0] divor;
wire [15:0] result,odd;initial
begin#10 divee = 12345;divor = 106; #100 divee = 2383;divor = 12;#100 divee = {$random}%100;divor = {$random}%10; #1000 $stop;
endunsignediv U1(divee,divor,result,odd);
endmodule
仿真结果
仿真过程中发现的reg疑问
(1)当使用随机数
module unsigned_tb;
reg [15:0] divee;
reg [7:0] divor;
wire [15:0] result,odd;initial
begin#10 divee = {$random}%10000;divor = {$random}%256; //{$random}%b表示产生一个0~b-1的随机整数#100 divee = {$random}%1000;divor = {$random}%100;#100 divee = {$random}%100;divor = {$random}%10; #1000 $stop;
endunsignediv U2(divee,divor,result,odd);
endmodule
仿真结果
可以看到,-127这一组计算错误,原因是:即使利用{$random}%b产生正随机数,但当最高位为1时,即数值大小超过128时,按照有符号整数补码的读数规则,为相应负数。而源代码只适用于无符号整数即正整数的除法运算,因此计算错误是在所难免的。通过手动输入具体数值,验证确实是这个原因。
(2)当手动输入
module unsigned_tb;
reg [15:0] divee;
reg [7:0] divor;
wire [15:0] result,odd;initial
begin#10 divee = 12345;divor = 106; //divor=8'b01101010#100 divee = 12345;divor = 106+128; //divor=8'd234=8'b11101010#100 divee = 2383;divor = 12;#100 divee = {$random}%100;divor = {$random}%10; #1000 $stop;
endunsignediv U3(divee,divor,result,odd);
endmodule
为了具有对比性,把除数的最高位分别设置为0和1,可以看到结果如下图所示:
仿真结果
8’b11101010 = 8’d234 = -8’d22,计算发生错误。其他例子都是正确的。
结论:
verilog中reg型变量是无符号整数类型,发生此类错误原因暂时不明。不过得到的教训是以后在仿真过程中注意:最好让数据最高位为0,避免发生溢出为负这样的错误。
Ps:如果有看到我这篇小记录且知道原因的小伙伴还请指教指教!!
无符号整数除法器:16位除8位相关推荐
- 7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令?
7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令? 解: - ...
- admin密码对应的MD5值,16位和32位,admin解密自己留着方便.
admin密码对应的MD5值,16位和32位,自己留着方便.admin的md5值是多少,常用密码加密md5值,123456,admin,admin888 如果遇到MD5加密文件(一般都是这个),而又不 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- node 16位 转24位_C代码实现16位和32位数据字节序转换
点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 每天给自己一个存在的意识,这样才会有一颗认真的心. 文 章 导 读 今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一 ...
- 16位转8位 winhex_64位系统究竟强在哪里?
想必大家都遇到过这样的问题:安装某个软件的时候,出现提示选择32位版本还是64位版本?我们也可以查看自己的电脑是32位还是64位系统. Windows Linux 大家可能知道32位和64位和系统有关 ...
- 16位和32位微处理器(3)——Pentium的先进技术
先进的体系结构 (1)内部总线(CPU内部的)32(64)位,外部数据总线(CPU与外设)64位 (2)片内代码Cache,数据Cache(缓冲,加快取指令和读写速度) (3)两条指令流水线并行(减小 ...
- 从16位到32位再到64位,为何16年过去,依然没有128位系统出现?
绝大部分人都没有意识到128位的处理器早已经存在了,并且已经存在了几十年.这么多年过去了,不光是128位的处理器出现了,256位.512位的处理器也同样出现了,比如Nvidia GTX 280这样的显 ...
- C语⾔:8位、16位、32位数据转换
C语⾔:8位.16位.32位数据转换 8位转16位 将2个8位数据u8_high.u8_low合成⼀个16位数据u16_data: u16_data=(u8_high<<8)| u8_lo ...
最新文章
- 祝贺!又一批清华大学长聘教授,来了!
- SAP PI - 同步 vs. 异步
- 自学python需要下载什么软件-一篇告诉你为什么人人都应该学点Python?
- 注意设置httpclient连接数
- 【S操作】冰箱正常运行监控系统需求整理
- Linux线程——线程同步
- RedHat Linux AS4 LAMP经典网站搭建实例
- nginx的负载均衡集群
- mininet 应用实践
- NOIP模拟 color(DP)
- [专栏精选]Unity中编码Encoding脱坑指南
- 创建git仓库和常用的命令
- 2017微信小程序全套源代码 最新 最全 好用
- Microsoft Dynamics AX 2012
- word中设置页码从任意页开始
- 计算机语音发展,计算机语音合成技术研究及发展方向
- [POI2012]HUR-Warehouse Store(贪心,堆)
- 在html中ex是什么单位,前端用到的那些单位
- 2021四川艺术高考成绩查询,2021四川高考艺术类分数线预测
- 程序员看片神器抱回家