9 123axj

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 20w+

C/C++内嵌汇编

在现代编程中,已经很少能见到纯汇编语言写的程序,但由于C/C+等高级语言在编译时会进行优化等,使得我们不能准确知道一段C代码在CPU上执行时的具体机器码操作,而对于某些特殊场景(如测试)又需要知道准确的指令操作,此时可以在C代码中使用嵌入式汇编。C/C+中的关键字asm,是告诉GCC编译器后面括号内的代码是内嵌汇编。 内嵌式汇编格式: __asm__( " 指令列表" : "输出列表 " : "输入列表 " :"破坏描述部分 "); 注意()里面的三个冒号缺一不可。如果想告...

2020-06-08 21:31:01

浮点数在内存中的存储方式

浮点数可以简单理解带小数点的数,像10.0也为浮点数。C/C++中使用的浮点数类型有float 和double (也分别称之为 单精度和双精度浮点数),其中float占4byte,32bit;double占8byte。在AI计算领域,又有FP32、FP16和BF16的数据类型(也称之为 单精度/半精度/混合精度 浮点数),FP32类型同C/C++中的float存储方式一样;从字面意思就可以看出,FP16和BF16类型在内存中占16bit。为了兼容和移植方便,目前的处理器都会遵循IEEE规定...

2020-06-07 11:49:56

C/C++ 多线程编程/ 绑定CPU

Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w32为我们提供了解决方案 多线程编程需要包含头文件 #include <pthread.h> #include <unistd.h> 中的函数 long sysconf (_SC_NPROCESSORS_ONLN); 可以获取当前CPU的核数。 多线程程序也可以在单核CPU上运行,但同...

2020-06-06 22:28:13

Python 正则表达式 检索和替换 re.sub 用法

语法: re.sub(pattern, repl, string, count=0, flags=0) pattern : 正则中的模式字符串。repl : 替换的字符串,也可为一个函数。string : 要被查找替换的原始字符串。count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。需要注意:re.sub并不改变原始字符串,替换后的新字符串通过返回值来表达,可以通过 string = re.sub(pattern, repl, string)的形式将原字符串替换...

2020-06-05 22:40:12

ASIC设计:FIFO 深度设置基本规则

一般情况下,设置一个fifo (同步或异步)的深度,主要是为了保证在fifo前级一直有东西要传输时,fifo的出口处不至于出现断流。 对于同步fifo,假设当前Fifo为full状态,从pop的时刻开始算起(此时刻fifo就可以认为not full,但not full的信号不一定什么时刻拉高),到push一个新的数据且出口端可以看到为止,计算这个延时;fifo的深度必须大于等于这个延时。一般情况下,pop的下一拍not full信号拉高,not full为高的当拍push一个...

2020-05-24 15:29:52

异步时钟FIFO的基本原理

在现代大规模ASIC设计中,经常会遇到跨时钟域的数据传输,此时就需要用到异步时钟FIFO。既然是先进先出的fifo,那就有push端和pop端。假设push端时钟为clcok A,pop端时钟为clock B。clock A和clock B可能前者主频高;也可能后者主频高;还有可能两边主频一样,但存在相位差 (片间互联时用的较多)。 要完成一个异步fifo的功能,至少要有以下信号(假设fifo深度为4,一层可以传输64bit数据) Signal ...

2020-05-23 21:55:17

C++ 关键字: extern

Extern用作变量声明,而不是变量定义,变量赋值时前面不用加extern。 在大型项目编程中,为了使代码结构清楚明了,往往会用不同的.h/.cpp文件来实现不同的功能模块。如果在模块A.h中定义了一个全局变量,在模块B.cpp中也想使用这个变量,此时就需要用到C/C++的关键字:extern。为什么必须要使用extern,因为C/C++有以下规则: 同一个变量或函数,能且只能被定义一次,但是可以被多次声明。 变量声明 规定了变量的类型和名字,...

2020-05-23 11:40:09

C/C++节约存储数据空间的方法:位域

有些时候,根据一个数据的取值范围(主要看最大取值),其在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。为了节省存储空间,并使处理简便,C/C++语言又提供了一种数据结构,叫做“位域”或“位段”。位域的定义和位域变量的说明位域定义与结构定义相仿。 struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度。 比如,我们想用一...

2020-05-23 10:10:06

模板类的分离式编译

对程序进行编译时,对于函数调用,编译器只要求函数的原型在调用点是可见的,至于函数的定义是否存在不做检查(在对程序进行链接时才检查函数的定义)。类似的,对于对象声明,编译器只要求所属的类定义在声明点是可见的,至于各成员函数的定义是否存在则不进行检查。因此,为了提高程序的可读性和可维护性,我们通常将函数原型和类定义放在头文件(.h文件)中,而函数定义(包括类成员函数的定义)则放在源文件(.cpp文件,又称实现文件)中。但是,模版编译则有所不同。从本质上说,模版并不是代码,而是指导编译器生成代码的指令,模版实例

2020-05-23 08:42:21

strcpy()、strncpy()和strcpy_s()区别

转载:https://www.cnblogs.com/lianshuiwuyi/p/7784870.html1、strcpy()原型:char *strcpy(char *dst,const char *src)功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括’\0’结束符,返回dst地址。要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,若dst空间不足,编译时并不会报错,但执行时因系统不同会出现不同的结果:Mac系统提示“Abort tra

2020-05-17 11:08:28

systemC: sc_signal cannot have more than one driver

如题,systemc规则中,同一个sc_signal不允许有多个驱动,也就是说,同一个sc_signal,只能在一个SC_METHOD或SC_THREAD中被write赋值,如果在多个SC_THREAD或SC_METHOD中write同一个信号,编译没问题,执行时就会报如题的错误,并给出提示,是哪两个thread/method。同一个sc_signal可以在多个SC_METHOD或SC_THREAD中被read。 这样的规则,是为了同RTL一致。RTL中,一个信号就是只能在一...

2020-05-13 20:57:19

C/C++ :Sizeof 的用法

Sizeof有以下特点:Sizeof是C/C++中的一个运算符,不是一个函数,返回值为size_t sizeof不能被编译成机器码,编译过程中就会计算sizeof的具体值,然后用值替换掉sizeof ()。所以可以用sizeof() 来定义数组的维数。 sizeof ()里面的内容也不能被编译,而是被替换成类型。 sizeof 后面可以直接加变量名,不用加();sizeof一个类型时,必...

2020-05-05 16:32:47

C/C++ 内存中的数据对齐

数据对齐,就是 数据所在的内存地址必须是该数据长度的整数倍,以64bit CPU为例,比如short变量的内存起始地址必须是2的整数倍,int/float必须是4的整数倍,long/double/指针类型 必须是8的整数倍,long double必须是16的整数倍。Bool/char为1byte,起始地址就任意了。 对于一个结构体来说( class或struct) ,总...

2020-05-05 11:09:43

C/C++中的逻辑右移和算术右移

逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。逻辑右移:右移后,左边补0算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,要对一个有符号数 执行逻辑右移,可以先...

2020-05-04 17:09:04

C/C++隐式数据类型转换 与 整型提升

C/C++中规定了一组内置类型的隐式类型转换规则,用于类型不一致的运算过程中。算术运算,如 int + short + double 时,int和short的变量会隐式转换为double,再与double进行加法。 关系运算,如 if ( int < unsigned int),会转换为较宽类型的unsigned int 赋值运算,如int = double,double的变...

2020-05-04 15:09:13

计算机大小端 及 内置类型字节长度

计算机系统是以字节为单位进行存储的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C/C++语言中除了8bit的char类型之外,还有int、long、float、double等多字节的内置数据类型,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。KEIL C51则为大端模式。X86、很多的ARM,DSP都为小端模式。 大端...

2020-05-01 17:40:46

C++和Verilog的运算符比较

  C++ 的位运算 与 Verilog有相似之处,也有区别。  C++ 的& | 是二元操作,表示按bit对每一bit都进行& |操作; Verilog 不仅可以是二元操作(二元操作 同C++),还可以是一元操作,表示 对自己本身按位 与操作、按位或操作。比如 wire [5:0] test_v = 6’b101011, |test_v = 1’b1, &test_...

2020-04-25 21:16:57

Cache 映射方式 学习总结

在计算机存储结构中,存在 一个存储容量金字塔,靠近塔顶的延迟小/造价高/容量小,靠近塔底的相对延迟大/造价低/容量大,任意两级之间都存在一个映射关系。在此,主要讨论cache和内存之间的映射关系,参考《大话处理器》5.2.3节 cache映射方式,学习总结如下。1 直接映射特点:主存中的一个块只能映射到Cache的某一特定块中去好处:随便给一个地址,就知道其在哪个cacheline...

2020-04-25 18:31:02

systemc: sc_event和sc_event_finder

在使用systemC模拟RTL的时序行为时,往往需要将clock的上升沿作为SC_METHOD的敏感事件列表。而设置敏感事件列表时,我们会遇到sensitive << sc_in_clk.pos() 和sensitive << sc_in_clk. posedge_event () 两种形式。那pos()和posedge_event ()有什么区别呢?查阅systemc使...

2020-04-11 16:56:53

SC_THREAD 和SC_METHOD对信号操作的交互问题

SC_THREAD 和SC_METHOD如果需要对同一个信号( sc_signal /sc_in/ sc_out)进行操作,比如在thread中进行write,在method中读,可能会打破SC_METHOD的clock触发机制,使得当拍write的值在当拍就能被read到。如文章最后源码中,TestThread在2ns 对m_sig赋值为1,按照正常逻辑,2ns 的read值依然是0,3ns才...

2020-04-05 22:22:02

查看更多

勋章 我的勋章
  • 签到达人
    签到达人
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 分享小兵
    分享小兵
    成功上传3个资源即可获取