有一個很無語的問題,什么是register?天天在配寄存器,但是不知道寄存器是什么。寄存器的地址偏移有的是1,有的是4。這個偏移量為什么偏移不是3?偏移量和register的data位數有沒有關系
基本隨便打開一份數字IC的數據手冊我們就會得到designer提供的register table。
24bit的register,A2:A0 選擇DAC地址,DB15:DB2設置DAC輸出電壓。
給自己的一點理解:
所有register,如果是接入clk的,xilinx稱為原語D flip-flop,就是大學本科的教材,D觸發器。
有32 bit的 register,就是32個DFF。DFF值從哪里來的?就是RTL級code的數百個module/IP里面input,output,reg信號。
這些信號拉到哪里去?拉到reg access的module,這個reg access的module就是通過填表,通過腳本gen出來的電路。
這個module port數非常大,大到只要register table里的有的信號,就會從其他各個模塊電路拉進來,input output信號極其多。
這份文檔有描述FPGA/ASIC狀態寄存器和控制寄存器的做法:
csrGen: Automated CSRs for ASIC/FPGA Processor Interfaces .pdf
control/status registers (CSRs),的意思IC內部的控制寄存器和狀態寄存器。
文檔大概的意思是說是用csrGen寫的一個腳本一樣的code,用戶可以通過填寫register table,最后可以綜合生成verilog register RTL code。
填表
用戶填表:
大概的意思是:
第一行就是定義:A就是register的地址address縮寫, 為0x0,共8bit,名字field1
第三行就是定義:A就是register的地址address縮寫, 為0x1,共8bit,名字version,類型是RO
后面還有一些W1C,wite 1 clear register value,這種太難了我也看不懂怎么實現的。我們就看一個register讀的,和寫的。
后面通過它寫的CSRGen,可以gen出一份RTL code。
我們來看一下上面csrGen出來的RTL code。
RTL級code定義了一個module,可以看到實際上對于讀寫指令,實際上就是1bit控制信號read/write,傳入的address[3:0],和up_datain[7:0]。
同時可以看到剛才看到RO類型的寄存器8bit version,實際上是從其他IP拉過來的,可以認為IC內部有很多個module/IP,這個viersion[7:0]就是從其他IP拉給chip_up_ifc 模塊的。
Read
當我們去讀寫reg的時候,實際上就傳入read的命令和address。
RTL怎么實現的呢?就是通過在chip_up_ifc,在敏感列表響應到read == 1’b1,采樣address值,通過case匹配,把需要RW的register地址,賦值到用戶的讀寫reg的接口上,即up_dataout_D[7:0] = version ;
version是其他module拉線來的,對于這個chip_up_ifc來說是input信號,up_dataout_D[7:0]是chip_up_ifc輸出的。
Write
當我們去寫reg的時候,實際上就傳入write的命令和address和data值。
RTL級code如下,當always塊敏感列表有write指令的時候,
看到case敏感列表里面是address,這里IC內部排布的reg地址是從0 1 2 3 4….
當對address 0,寫的時候,就把用戶想要寫入的數據up_datain[7:0],賦值給address 為0的field1_D。
我們剛才填寫的register profile就是
%A 0
7:0 field1
這里是對field1_D賦值而不是field1的原因是,在內部生成了2個reg。一個是field1,field1_D。以我幾個禮拜的RTL coding基礎,猜測是防止直接操作field1影響它原本所在的電路,通過下一個clk信號,
才把field1 <= field1_D,打了一拍。
RTL在下面63行也有體現。register的初值怎么做到的,也在always塊的init1下降沿觸發賦值有體現。
所以就有了以下結論,
Q:IC內部的寄存器偏移地址一定是1或4,有什么含義嗎?
A:沒有任何意義。這邊address,在always塊每次匹配的是多少就是訪問的哪個reg,它可以偏移1,偏移100,1000都可以,甚至排布可以是1 3 5 7 9;
A:每個address獲得的reg數據位寬和偏移有關系嗎?
Q:也沒有,想定義每個address的reg的位寬是13個bit都可以,并不是8 /16/32 bit。RTL決定了本質是多少個DFF。在clock節拍下寄存下別的module拉過來的信號值。但是多少考慮到數據位寬,也要定義成8/16/32吧。
A:上面結論是不是都對的?
Q:不一定,都是我猜的,其實我是做硬件的不太懂FPGA,有幸在南郵讀書期間和FPGA coder聯調過小半年。這邊我猜測:軟件跑在SOC,SOC有些reg地址,好像就是access sram,sram有大小的,8k的sram就被分成了那么多地址。軟件那邊定義的應該有關聯的吧?RTL實現的reg是無關聯的。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
Register
+關注
關注
0文章
36瀏覽量
13938 -
地址
+關注
關注
1文章
32瀏覽量
10763
發布評論請先 登錄
相關推薦
評論