SATA基础+更改终端颜色+PCI.ids位置+Linux和Windows的scanf+C语言C++的局部变量与全局变量的重名问题+多个C文件编入到SV中+UVM event pool的例化+ar、nm和ranlib

发布时间 2023-11-05 17:22:36作者: 大浪淘沙、

SATA基础

https://zhuanlan.zhihu.com/p/554251608

物理信号

image
image

物理层功能

时钟恢复:对于高频传输,一般是采用差分信号传输,并且没有单独的时钟,时钟存在于编码内部
串并转换:对于高频传输,串联信号可以做到更高的频率。
字节对其:8/10 编码转换的10bit对其

链路层、传输层

链路层和传输层需要实现:8b10b 编解码、原语生成和检测(包括FIS包边界识别)、加扰/解扰、CRC生成和检验、流控。
8b10b 编解码是为了让 0 和 1 尽量均匀地分布,这样接收方才能对信号进行时钟恢复;
原语插入和检测中的原语并不携带数据,而是用来进行通信控制,如 ALIGN 原语用来进行字节对齐、X_RDY 原语用来告诉对方自己想发送一个 FIS 给对方,SOF 原语用来指示 FIS 的开头、EOF 原语用来指示 FIS 的结尾;
FIS加扰/解扰中的加扰是让 SATA 电缆上传输的数据更加杂乱,从而让电磁辐射更加接近白噪声(而不是集中分布于某个频率),从而减少电磁干扰(EMI),加扰和解扰通过伪随机和信号的异或实现;
CRC生成和检验中,TX 通道需要根据 FIS 数据计算出 CRC 并追加在 FIS 的最后;RX 通道需要根据收到的 FIS 数据生成 CRC ,并与收到的 CRC 进行对比(也即CRC检验)。这个是内部的校验,如果是存储到数据中,应该还有一个校验信息,像cache一样。
流控依赖于 HOLD 和 HOLDA 原语:当发送方暂未准备好待发送的 FIS 数据时,发送方可以插入 HOLD 原语来填空;当接收方暂不能接收 FIS 数据时,接收方可以向发送方发送 HOLD 原语,发送方就会暂停发送数据并向接收方发送 HOLDA 原语来填空。
image

更改终端颜色

https://www.cnblogs.com/jintianfree/p/4019834.html
注意前面的优先级更高,而且不会覆盖,因此要写到最前面。LS_COLORS控制ls打印出来的颜色。

echo $LS_COLORS > cfg.txt
vim cfg.txt
I
*.log=4:
<ESC>
LS_COLORS=`cat cfg.txt`  

PCI.ids位置

https://pci-ids.ucw.cz/

/usr/share/hwdata/pci.ids

Linux和Windows的scanf

Linux的sscanf会更改指针的位置。一般以Linux运行结果为准。Windows下的库函数实现可能不一样。

#include <stdio.h>

int main ()
{
    int var_runoob = 10;
    int *p;              // 定义指针变量
    p = &var_runoob;

   printf("var_runoob 变量的地址: %p\n", p);

   scanf("%d", &var_runoob);
   printf("pass\n");
   printf("var_runoob 变量的地址: %p\n", p);
   printf("int is : %d \n", var_runoob);

   sscanf("0", "%p", (void **)&var_runoob);
   printf("pass\n");
   printf("var_runoob 变量的地址: %p\n", p);
   printf("int is : %d \n", var_runoob);


   sscanf("1", "%p", (void **)&var_runoob);
   printf("pass\n");
   printf("var_runoob 变量的地址: %p\n", p);
   printf("int is : %d \n", var_runoob);
   return 0;
}

C语言C++的局部变量与全局变量的重名问题

使用::操作符,是C++的语法,gcc编译器上报错,所以C语言按道理是不支持局部变量和全局变量重名,但是C++支持。
https://blog.csdn.net/juanjuan888/article/details/6958000
下述代码由GPT生成,并测试通过。使用g++编译。

#include <stdio.h>

int global_variable = 10;

void example_function() {
    int global_variable = 20;  // 与全局变量同名的局部变量
    printf("Local variable: %d\n", global_variable);  // 输出局部变量的值
    printf("Global variable: %d\n", ::global_variable);  // 使用全局作用域访问全局变量
}

int main() {
    example_function();
    printf("Global variable from main: %d\n", global_variable);  // 输出全局变量的值
    return 0;
}

多个C文件编入到SV中

https://blog.csdn.net/sxlwzl/article/details/30017031
VCS的filelist并不支持C/C++语言,而展开写C/C++则导致命令行过长。
解决办法:先编译c代码,shared属性;再编译sv/v代码。

  1. 编译C、C++
g++ -Wall -m64 -g -fPIC -shared \
	your_cpp1.cpp your_cpp2.cpp -o your_gen.so
  1. 编译时候选项
vcs -debug_all -full64 -sverilog -R \
	 rtl_file.sv your_gen.so

UVM event pool的例化

https://blog.csdn.net/weixin_43249032/article/details/87738218

在uvm_event_pool::m_global_pool这个静态全局单例中的创建了一个uvm_event对象,并存放在关联数组uvm_event_pool::m_global_pool.pool[string]中,索引就是get or get_global ()的参数, 如果这个字符串索引已经存在,那么就返回这个pool[string]句柄。

uvm_event_pool ev_pool = uvm_event_pool::get_global_pool();

ar、nm和ranlib

ar命令是归档的意思

是将多个文件合并到单个文件的过程,并生成一个归档号码。
r添加的时候,重复的不会添加
D使用的时候,归档号格式发生变化
s使用的时候,索引会更新(据说)
q添加的时候,重复的也会添加
t是查看列表

[root@centos /home/tank/ar_test]$ touch test1.o
[root@centos /home/tank/ar_test]$ ar -q mytest.a test1.o
ar: creating mytest.a
[root@centos /home/tank/ar_test]$ ar -d mytest.a test1.o
[root@centos /home/tank/ar_test]$ ar rs mytest.a test1.o
[root@centos /home/tank/ar_test]$ ar t mytest.a test1.o
test1.o

nm命令查看符号表

nm /usr/lib/i386-linux-gnu/librt.a  #用来列出目标文件的符号清单

ranlib 更新静态库的符号索引表

相当于更新链接表,和ar -s命令相同(据说)

我们所使用到的静态库(文档文件)中,存在这样一个特殊的成员,它的名字是 “.SYMDEF”。它包含了静态库中所有成员所定义的有效符号(函数名、 变量名)。因此,当为库增加了一个成员时,相应的就需要更新成员 “.SYMDEF”,否则所增加的成员中定义的所有的符号将无法被连接程序定位。