主頁 > 後端開發 > Xilinx約束學習筆記(二)—— 定義時鐘

Xilinx約束學習筆記(二)—— 定義時鐘

2021-08-31 18:21:27 後端開發

2. 定義時鐘

2.1 關于時鐘

為了獲得最佳精度路徑覆寫資訊,必須正確定義時鐘,

  • 時鐘要定義在時鐘樹的根 pin 或 port 上,稱為 source point,
  • 時鐘的邊緣應該由周期和波形進行組合描述,
  • 周期使用納秒做為單位進行定義,它對應于波形重復的時間,
  • 波形是一系列的上升沿和下降沿絕對時間串列,單位為納秒,并且所有時間在一個時鐘周期內,串列必須包含偶數個值,第一個值始終對應于第一個上升邊緣,如果沒有指定波形,波形的默認占空比為 50%,相移為 0,

2.1.1 傳播時鐘

周期和波形屬性只展現出了時鐘的理想特性,當時鐘進入 FPGA 并通過時鐘樹傳播時,時鐘邊沿被延緩,并受噪聲和硬體行為引影響,這些特性稱為時鐘網路延遲和時鐘不確定性,時鐘的不確定性包括:

  • 時鐘抖動(clock jitter)
  • 相位錯誤
  • 用戶指定添加的不確定性

默認情況下,Vivado 在做時序分析時,始終將時鐘視為傳播時鐘,即非理想時鐘,以此提供準確的余量值,其中包括時鐘樹插入延遲和不確定性,

2.1.2 專用硬體資源

FPGA 有大量專用的時鐘管腳,這個管腳可以專門用來做時鐘的輸入,FPGA 內部包含有 MMCM、PLL 和 BUR 之類的時鐘資源,

2.2 基準時鐘(Primary Clock)

基準時鐘是通過 FPGA 輸入埠或千兆收發器輸出引腳(例如,恢復時鐘)進入設計的時鐘,基準時鐘只能通過 create_clock 指令進行定義,(為什么是千兆收發器?下面的話應該可以解釋,7 系列的 GT 恢復時鐘不能自動推導,必須手動定義,而 US 和 USP 系列的可以自動推導,不需要人為定義)

Primary clocks must be defined on a gigabit transceiver output only for Xilinx? 7 series FPGAs. For UltraScale and UltraScale+? devices, the timer automatically derives clocks on the GT output ports.

基準時鐘必須附加到網表物件,該網表物件代表設計中的所有時鐘邊沿起點,并且是時鐘樹上向下游傳播的起點,換句話說,基準時鐘的源點定義了零時間點,這個點被 Vivado 用來計算余量方程時,作為時鐘延遲和不確定性的零起點,Vivado 會忽略來自定義基準時鐘點上游單元的所有時鐘樹延遲,如果基準時鐘錯誤的定義在了路徑中間的引腳上,則只有部分延遲用于時序分析,
這可能會引起問題,因為時鐘之間的偏斜和余量值會變得不準確,

2.2.1 基準時鐘示例

image-20210823215132300

# 周期 10ns, 來源于外部,通過 sysclk 埠輸入,占空比 50%,相位為 0,
create_clock -period 10 [get_ports sysclk]

# 周期 10ns, 來源于外部,通過 ClkIn 埠輸入,占空比 25%,相位為 90,
create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn]

image-20210823215303233

# GT 的恢復時鐘無法自動推導時,需要手動約束,Vivado 在計算余量時,會從RXOUTCLK開始,
create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]

image-20210823220104689

# 對于差分時鐘,時鐘必須定義在 P 端上,N 端上不能有定義,如果 P 和 N 各自定義一次,會導致軟體認為是異步路徑,
create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]

2.3 虛擬時鐘(Virtual Clocks)

虛擬時鐘是一種沒有物理連接到設計中任何網表元素的時鐘,虛擬時鐘是通過 create_clock 指令定義的,但無需指定源物件,虛擬時鐘通常用于指定輸入和輸出延遲約束:

# 創建時鐘,但不指定時鐘源
create_clock -name clk_virt -period 10

2.4 衍生時鐘(Generated Clocks)

2.4.1 關于衍生時鐘

衍生時鐘產生于 FPGA 設計內部,通常由 MMCM 或用戶邏輯產生,衍生時鐘有一個關聯的主時鐘(master clock),指令 create_generated_clock 需要指定一個主時鐘,它可以是基準時鐘或者是另一個衍生時鐘,衍生時鐘屬性直接源自其主時鐘,定義衍生時鐘時,不是指定它們的周期或波形,而是描述如何轉換主時鐘到衍生時鐘,衍生時鐘和主時鐘之間的關系可以是以下任何一種:

  • 簡單的分頻
  • 簡單的倍頻
  • 分頻和倍頻的組合,用來得到一個非整數比的分頻,
  • 移相或反相
  • 改變占空比
  • 所有上面的組合

為了計算衍生時鐘的延遲,工具會跟蹤衍生時鐘的源引腳和主時鐘的源引腳之間的時序路徑和組合路徑,在某些情況下,可能需要僅跟蹤組合路徑以計算生成的時鐘延遲,可以使用 -combinational 行選項執行此操作,

2.4.2 用戶自定義的衍生時鐘

2.4.2.1 示例1:簡單的2分頻

image-20210823224136595

create_clock -name clkin -period 10 [get_ports clkin]

# Option 1: master clock source is the primary clock source point
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q]

# Option 2: master clock source is the REGA clock pin
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 [get_pins REGA/Q]

2.4.2.2 示例2:使用 -edge 選項進行2分頻

可以不使用 -divide_by 選項,而是使用 -edges 選項直接基于主時鐘邊沿描述衍生時鐘波形,該引數是一組主時鐘邊沿的序號,用來標記衍生時鐘的跳變沿的位置,從衍生時鐘的上升沿開始描述,

# waveform specified with -edges instead of -divide_by
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} [get_pins REGA/Q]

2.4.2.3 示例3:使用 -edge 和 -edge_shift 選項改變占空比和相位

當需要做移相時,可以使用 -edge_shift 選項,衍生時鐘的每個邊沿都可以單獨的進行正向或負向移相,-edge_shift 選項 不能和以下選項同時使用:

  • -divide_by
  • -multiply_by
  • -invert

假設主時鐘 clkin 的周期為 10 ns,占空比為 50% ,clkin 輸入到 mmcm0 后,衍生出一個時鐘,其占空比為 25%,移相 90 度,衍生時鐘定義基于主時鐘的第 1、2 和 3 邊沿,這些邊沿跳變分別發生在 0ns、5ns 和 10ns 上,要獲得所需的波形,將第一和第三邊沿移動 2.5ns,

image-20210823225527551

create_clock -name clkin -period 10 [get_ports clkin]
# First rising edge:   0ns + 2.5ns = 2.5ns
# Falling edge:        5ns + 0ns   = 5ns
# Second rising edge: 10ns + 2.5ns = 12.5ns
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3} \
    -edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]

注意: -edge_shift 的值可以為正數,也可以為負數,

2.4.2.4 示例4:同時使用 -divide_by 和 -multiply_by

Vivado 允許同時指定 -divide_by-multiply_by,這是對 SDC 的擴展,雖然這對于手動定義 MMCM 或 PLL 生成的時鐘特別方便,但是 Xilinx 建議讓軟體自動創建這些約束,如果手動定義了約束,必須確認約束的設定和鎖相環本身的配置是相匹配的,

# 假設 MMCM 生成的時鐘頻率為原主時鐘的 4/3,
create_generated_clock -name clk43 -source [get_pins mmcm0/CLKIN] -multiply_by 4 \
    -divide_by 3 [get_pins mmcm0/CLKOUT]

2.4.2.5 示例5:追蹤主時鐘的組合邏輯路徑

在此示例中,假設主時鐘同時驅動基于暫存器的時2分頻器和時鐘多路復用器,時鐘多路復用器可從選擇主時鐘或2分頻時鐘,在此方案中,從主時鐘到生成的時鐘有兩條路徑,即時序邏輯路徑和組合邏輯路徑,我們希望在多路復用器輸出上創建一個衍生時鐘,該輸出反映了從主時鐘到多路復用器的組合路徑的延遲,這可以通過使用 -combinational 選項完成的:

image-20210824095944630

create_generated_clock -name clkout -source [get_pins mmcm0/CLKIN] -combinational [get_pins MUX/O]

2.4.2.6 示例6:由 ODDR 驅動的轉發時鐘

在此示例中,由 ODDR 單元驅動的輸出埠上創建轉發時鐘,轉發時鐘參考驅動 ODDR/CLKDIV 引腳的主時鐘,并且與主時鐘(-divide_by 1) 具有相同的周期,

image-20210824100521913

create_generated_clock -name ck_vsf_clk_2 -source [get_pins ODDRE1_vsfclk2_inst/CLKDIV] -divide_by 1 [get_ports vsf_clk_2]

2.4.3 自動推匯出的衍生時鐘

自動推導的時鐘也稱為自動生成時鐘,Vivado 會自動在 CMB( Clock Modifying Blocks)的輸出引腳上創建這些約束,前提是相關的主時鐘已經定義,

  • Xilinx 7 系列的 CMB 可以是:
    • MMCM*/ PLL*
    • BUFR
    • PHASER*
  • Xilinx UltraScale 系列的 CMB 可以是:
  • MMCM* / PLL*
  • BUFG_GT / BUFGCE_DIV
  • GT* _COMMON / GT*_CHANNEL / IBUFDS_GTE3
  • BITSLICE_CONTROL / RX*_BITSLICE
  • ISERDESE3

如果用戶定義的時鐘(主時鐘或衍生時鐘)也在同一網串列物件(即在同一定義點(pin 或 net)上定義,Vivado 則不會自動創建衍生時鐘,

2.4.3.1 自動衍生時鐘示例

以下自動衍生時鐘示例是由 MMCM 生成的時鐘, 主時鐘 clkin 驅動 MMCME2 實體 clkip/mmcm0 的輸入 CLKIN,自動生成的時鐘的名稱是 cpuClk,其定義點是 clkip/mmcm0/CLKOUT,

image-20210824104151371

使用 get_clocks -of_objects <pin/port/net> 命令在不知道其名稱的情況下查詢自動生成的時鐘,這使的約束或腳本相對通用,不用關心時鐘名稱是否有改動,

2.4.3.2 本地網名

如果 CMB 實體位于設計層次結構內,則生成的時鐘名稱將使用本地網名(即沒有父單元名的名稱),例如,對于名稱為 clkip/cpuClk 的層次網線:

  • 父單元名稱為 clkip ,
  • 生成的時鐘名稱為 cpuClk,

2.4.3.3 名稱沖突

如果兩個自動生成的時鐘之間的名稱有沖突,Vivado 會添加獨有的后綴來區分它們,例如:

  • usrclk
  • usrclk_1
  • usrclk_2

強制修改衍生時鐘的名稱:

  • 在 RTL 中選擇獨特且相關的網名,
  • 使用 create_generated_clock 強制使用指定的名稱,

2.4.4 重命名自動衍生時鐘

可以對工具自動創建的衍生時鐘進行重命名,重命名通過使用 create_generated_clock 指令和有限的引數完成,

create_generated_clock -name new_name [-source master_pin] [-master_clock master_clk] source_object

必須指定的引數有新生成的時鐘名稱和生成時鐘的源物件,生成時鐘的源物件是創建衍生時鐘的物件(CMB 的輸出引腳、UltraScale GT 的輸出引腳等),只有當多個時鐘通過源引腳傳播時,才能使用源和主引數,以消除任何模糊性,當有多個時鐘通過源物件傳播時,必須指定 -source-master 引數,以消除任何不明確的地方,

注意:如果有 -edges / -edge_shift / -divide_by / -multiply_by / -combinational / -duty_cycle / -invert 選項傳遞到create_generated_clock 指令,則自動生成衍生時鐘不會被重命名,相反會重新定義一個新的衍生時鐘,

注意:使用 OOC 模式的模塊在綜合時,模塊被當做黑盒,模塊內部引腳和時鐘名稱不可訪問,在這種情況下,用于綜合的頂層 XDC 約束不能指定時鐘名稱或重命名模塊內生成的自動衍生時鐘,可以使用一些查詢指令參考相關目標,如 get_clocks -of_objects [get_pins <OOC_MODULE_OUTPUT_CLOCK_PORT>],用于實作的 XDC 約束沒有此限制,

重命名的限制:

  • 自動衍生時鐘只能在其源引腳上重命名,例如在 CMB(PLL、MMCM. .. ) 的輸出處,自動衍生時鐘不能在 BUFG 的輸出上重命名,即便時鐘是通過它傳播的,
  • 無法重命名基準時鐘或用戶定義衍生時鐘,只有自動衍生時鐘才能使用此機制進行重命名,
  • source_object 必須匹配創建自動衍生時鐘的物件,
  • 如果工具無法重命名衍生時鐘,則會回傳錯誤,重命名完成時,主時鐘也必須存在,
  • 自動衍生時鐘可以在 XDC 內的任何時間重命名,即使已被某些時序約束參考,

2.5 時鐘組(Clock Groups)

2.5.1 關于時鐘組

默認情況下,Vivado 會對設計中所有時鐘之間的路徑進行時序收斂,除非使用了時鐘組或偽路徑進行約束,set_clock_groups 指令會讓 Vivado 不對時鐘組之間的路徑進行時序分析,而同一組內的時鐘之間的仍會進行時序收斂,與 set_false_path 約束不同,兩個時鐘之間的兩個方向的路徑都會被忽略,

可以多次使用 -group 選項指定多個時鐘組,如果組中的時鐘在設計中都不存在,則組將變為空,set_clock_groups 約束至少需要兩組,并且都不為空組時才有效,如果只有一個組有效,其他組都為空時,set_clock_groups 約束不會生效,并回傳錯誤訊息,

使用原理圖查看器(Schematic Viewer)或時鐘網路報告(Clock Networks Report)查看可視化時鐘樹的拓撲,確定哪些時鐘不能一起進行收斂,您還可以使用時鐘互動報告來(Clock Interactions Report)查看兩個時鐘之間的現有約束,并確定它們是有相同的主時鐘(即它們具有已知的相位關系),或者判斷出周期沒有公倍數的時鐘(Unexpandable),

謹慎!忽略兩個時鐘之間的時序分析并不意味著它們之間的路徑將在硬體上能正常作業,為了防止亞穩態,必須確認這些路徑是否具有適當的同步電路或異步資料傳輸協議,

2.5.2 時鐘分類

  • 同步時鐘
    當兩個時鐘的相對相位關系是已知的,它們就是是同步時鐘,通常它們的時鐘樹源頭來自網串列中的同一根,它們的周期有公倍數,例如,衍生時鐘和他的主時鐘的周期比率為 2,這兩個時鐘是同步的,因為它們有相同時鐘源點,并且周期為2倍關系,它們可以安全地一起進行時序收斂,

  • 異步時鐘
    當無法確定兩個時鐘的相對相位關系時,這兩個時鐘就是異步的,例如,由板上兩個獨立晶振生成的時鐘,通過不同輸入埠進入 FPGA,這兩個時鐘就是異步的,如果它們是由板上的同一晶振生成的,這兩個就不是異步時鐘,在大多數情況下,基準時鐘可以被視為異步時鐘,

  • 不可擴展的時鐘(Unexpandable Clocks)
    當時序引擎在 1000 個周期中無法找到兩個時鐘周期的公倍數時,則認為兩個時鐘無法擴展,在這種情況下,在時序分析時會使用 1000 周期中最小的相位關系,但時序引擎無法保證這是最差的情況,通常這兩個時鐘之間的周期比比較奇怪的情況,例如,兩個時鐘 clk0 和 clk1,由相同主時鐘的兩個 MMCM 生成,clk0 周期為 5.12 ns,clk1 周期為 6.66 ns,他們的上升沿在 1000 個周期內沒有對齊的時候,時序引擎會取最差的情況 0.01 ns 做時序收斂,與異步時鐘一樣,余量計算會正常進行,但其值是不可信的,因此,無可擴展的時鐘經常被處理為異步時鐘,必須用處理異步時鐘相同的方式對待這兩個時鐘,包括其約束和異步電路,

2.5.3 異步時鐘組

異步時鐘和不可擴展時鐘不能被時序收斂,使用 set_clock_groups 指令可以在時序分析時忽略它們之間的時序路徑,

注意set_clock_groups 比普通的時序例外的優先級要高,如果需要約束和報告異步時鐘間的路徑,那就不能使用 set_clock_groups ,只能使用時序例外,

2.5.3.1 異步時鐘組示例

  • 基準時鐘 clk0 定義在輸入管腳上,并連接到了 MMCM,MMCM 生成了 usrclk 和 itfclk 兩個時鐘 ,
  • 另一個基準時鐘 clk1 定義在了 GTP 輸出的恢復時鐘上,并連接到了另一個 MMCM,此 MMCM 生成了 gtclkrx 和 gtclktx 兩個時鐘,

使用 -asynchronous 選項創建異步時鐘組,

set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk0 usrclk itfclk} \    -group {clk1 gtclkrx gtclktx}

如果衍生時鐘的名稱無法事先得知,可以使用 get_clocks -include_generated_clocks 動態獲取,所以上面的約束也可以寫成如下方式,其移植性更強,

set_clock_groups -name async_clk0_clk1 -asynchronous \    -group [get_clocks -include_generated_clocks clk0] \    -group [get_clocks -include_generated_clocks clk1]

注意:上面的約束中,異步是指組與組之間異步,組內各時鐘仍會進行時序分析和收斂,

2.5.4 獨占時鐘組(Exclusive Clock Groups)

有些設計擁有多種操作模式,在不同的模式下需要使用不同的時鐘,時鐘之間的選擇通常使用時鐘多路復用器完成,如 BUFGMUX 和 BUFGCTRL 或 LUT(盡量不使用LUT做時鐘選擇),由于這些單元是組合邏輯,所這些時鐘都通過同一個時鐘樹傳播,這些時鐘會同時報告中呈現,但在硬體方面是不可能的,同一時刻只會有一個時鐘,這種不會同時作業的時鐘稱作獨占時鐘,

2.5.4.1 獨占時鐘組示例

獨占時鐘使用 set_clock_groups-logically_exclusive-physically_exclusive 選項進行定義,在 Vivado 中,這兩個選項的意義是相同的,任意使用一個即可,

假設一個 MMCM 輸出了 clk0 和 clk1,這兩個時鐘連接到了一個 BUFGMUX(實體名為clkmux),輸出 clkmux 驅動時鐘樹,默認情況下,Vivado 會分析 clk0 和 clk1 之間的路徑,即便兩個時鐘驅動同一個時鐘樹,并且兩個時鐘不可能同時使用,必須使用如下約束停止分析兩個時鐘之間的路徑,

set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive -group clk0 -group clk1

2.6 時鐘延遲、抖動和不確定性

除了定義時鐘波形外,還必須指定與操作條件和環境相關的可預測變化和隨機變化,

2.6.1 時鐘延遲

時鐘在 PCB 板上和 FPGA 內部傳播后,時鐘沿會經過一段延時后到達目的地,此延時通常有:

  • 源延時(通常在時鐘源點之前,在 FPGA 設備外部),
  • 網路延時,

網路延時(也稱為插入延時),其延時值要么是自動估算(pre-route design),要么是精確計算(post-route design),

Xilinx FPGA 使用 set_clock_latency 指令主要是用來指定器件外部的延時,

# Minimum source latency value for clock sysClk (for both Slow and Fast corners)set_clock_latency -source -early 0.2 [get_clocks sysClk]# Maximum source latency value for clock sysClk (for both Slow and Fast corners)set_clock_latency -source -late 0.5 [get_clocks sysClk]

2.6.2 時鐘不確定性

2.6.2.1 時鐘抖動

對于 ASIC 設備,時鐘抖動通常表示在時鐘不確定性特征中,然而,對于 FPGA 來說,抖動特性是可以預知的,它們可以通過時序分析引擎自動計算,也可以單獨指定,

  • 輸入抖動(Input Jitter)
    輸入抖動是連續時鐘邊緣與理想時鐘到達時間的差別,輸入抖動是一個絕對值,表示時鐘邊緣兩側的變化,使用 set_input_jitter 指令單獨指定每個基準時鐘的輸入抖動,衍生時鐘上的輸入抖動無法直接指定,Vivado 時序引擎會自動從主時鐘繼承的抖動到衍生時鐘,

    • 對于由 MMCM 或 PLL 生成的時鐘,輸入抖動被計算的不同的抖動替換,
    • 對于由組合邏輯或時序邏輯生成的時鐘,生成時鐘抖動與其主時鐘抖動相同,

    以下命令在通過輸入埠 clkin 傳播的基準時鐘上設定 +/-100 ps 抖動:

    set_input_jitter [get_clocks -of_objects [get_ports clkin]] 0.1
    
  • 系統拉動(System Jitter)
    系統抖動是由于電源噪聲、板噪聲或系統的任何額外抖動而導致的整體抖動,使用 set_system_jitter 指令只為整個設計設定一個值,即針對所有時鐘,

2.6.2.2 附加時鐘不確定性

使用 set_clock_uncertainty 指令定義不同角落、延時或特定時鐘關系所需的額外時鐘不確定性,這一種方便為設計增加額外余量的方法,

無論約束的順序如何,時鐘相互間的不確定性總是優先于簡單的時鐘不確定性,在下示例中,雖然時鐘 clk1 上最后定義了 1.0 ns 的簡單時鐘不確定性,但從時鐘 clk1 到時鐘 clk2 的計時路徑受到 2.0 ns 時鐘不確定性的限制,

set_clock_uncertainty 2.0 -from [get_clocks clk1] -to [get_clocks clk2]set_clock_uncertainty 1.0 [get_clocks clk1]

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/296037.html

標籤:Verilog

上一篇:FPGA 串口UART學習筆記1串口通信

下一篇:Verilog實體陣列

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more