国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

cocotb中的基礎語法

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-21 09:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

cocotb的出現使得我們能夠在做RTL仿真驗證時依托Python來進行測試用例的構建,當我們習慣了用Verilog、SystemVerilog來構建測試用例時,切換到cocotb后最直觀的方式便是我們能夠建立cocotb中的基礎語法與SystemVerilog中仿真常用的關鍵字又一個對應,能夠使我們又一個初步的對照。本篇就cocotb中的基礎語法與SystemVerilog中的常用語法做一個對照總結。

非阻塞賦值

在使用Systemverilog進行仿真時,對于接口信號,往往建議采用非阻塞賦值進行操作,其符號為“<=”.

在cocotb中,對于信號的賦值,其提供相應的非阻塞賦值方式,其符號也同樣為“<=”。

在cocotb的手冊里提到:

The syntaxsig<=?new_value?is a short form of?sig.value?=?new_value. It not only resembles HDL syntax, but also has the same semantics: writes are not applied immediately, but delayed until the next write cycle.

因而我們可以在cocotb中這樣來進行非阻塞賦值:

# Get a reference to the "clk" signal and assign a valueclk = dut.clkclk.value = 1
# Direct assignment through the hierarchydut.input_signal <= 12
# Assign a value to a memory deep in the hierarchydut.sub_block.memory.array[4] <= 2

阻塞賦值

針對阻塞賦值(立即生效),cocotb提供了相應的語法:

setimmediatevalue(value)

因而對于阻塞賦值,我們在cocotb中可以這樣寫:

dut.input_signal.setimmediatevalue(1)

信號值讀取

對于信號的讀取,我們在SystemVerilog中,可以直接讀取信號值,而在cocotb中,其為接口變量提供了value方法屬性用于獲取信號值。

讀取方式:sig.value

返回類型:BinaryValue

Accessing thevalueproperty of a handle object will return aBinaryValueobject. Any unresolved bits are preserved and can be accessed using thebinstrattribute, or a resolved integer value can be accessed using theintegerattribute.

信號的讀取我們可以這么來寫:

# Read a value back from the DUTcount=dut.counter.valueprint(count.binstr)1X1010# Resolve the value to an integer (X or Z treated as 0)print(count.integer)42# Show number of bits in a valueprint(count.n_bits)6

#Time

在仿真里延遲等待是經常遇到的,在cocotb里,我們通過Timer來實現延遲:

cocotb.triggers.Timer(time_ps,units=None)

Parameters

time_ps (numbers.Real or decimal.Decimal) – The time value. Note that despite the name this is not actually in picoseconds but depends on the units argument.

units (str or None, optional) – One of None, 'fs', 'ps', 'ns', 'us', 'ms', 'sec'. When no units is given (None) the timestep is determined by the simulator.

由于cocotb是基于協程的,而延遲函數的執行的時間長度是依賴于仿真器的,因此Timer延遲的執行需調用await:

await Timer(1, units='ns')

邊沿檢測

在SystemVerilog中我們常用posedge、negedge來檢測上升沿和下降沿,在cocotb里,針對邊沿檢測,其提供了四個調用:

等待調變

class cocotb.triggers.Edge(*args, **kwargs)

Fires on any value change of signal.

等待上升沿

class cocotb.triggers.RisingEdge(*args, **kwargs)

Fires on the rising edge of signal, on a transition from 0 to 1.

等待下降沿

class cocotb.triggers.FallingEdge(*args, **kwargs)

Fires on the falling edge of signal, on a transition from 1 to 0.

檢測等待指定到個數邊沿

class cocotb.triggers.ClockCycles(signal,num_cycles,rising=True)

Fires after num_cycles transitions of signal from 0 to 1.

Parameters

signal – The signal to monitor.

num_cycles (int) – The number of cycles to count.

rising (bool, optional) – If True, the default, count rising edges. Otherwise, count falling edges.

我們在使用時,可以這么來寫:

#等待信號signalA發生變化await cocotb.triggers.Edge(dut.signalA)#等待signalA從0變為1await cocotb.triggers.RisingEdge(dut.signalA)#等待signalA從1變為0await cocotb.triggers.FallingEdge(dut.signalA)#等待signalA從0變為1三次awaitcocotb.triggers.ClockCycles(dut.signalA,3,true)

fork-join_none

SystemVerilog中的fork-join_none用于發起一個線程但不等待線程的結束,在cocotb中,相應的語法為fork:

cocotb.fork()

Schedule a coroutine to be run concurrently

在寫仿真代碼時,我們可以這么寫:

async def reset_dut(reset_n, duration_ns):    reset_n <= 0    await Timer(duration_ns, units='ns')    reset_n <= 1    reset_n._log.debug("Reset complete")reset_thread = cocotb.fork(reset_dut(reset_n, duration_ns=500))

這里值得注意的是,由于fork是起一個協程,因而resut_dut需添加async聲明。

fork-join

與SystemVerilog中相對應的,cocotb等待一個協程的結束同樣提供了join方法:

class cocotb.triggers.Join(*args, **kwargs)

Fires when a fork()ed coroutine completes.

The result of blocking on the trigger can be used to get the coroutine result:

使用方式:

async def coro_inner():    await Timer(1, units='ns')    return "Hello world"
task = cocotb.fork(coro_inner())result = await Join(task)assert result == "Hello world"

fork-any

相較于SystemVerilog中的join-any語法,cocotb并無專門的對應語法,但卻有相似的方法供調用:

class cocotb.triggers.First(*triggers)

等待第一個協程結束即返回

t1 = Timer(10, units='ps')t2 = Timer(11, units='ps')t_ret = await First(t1, t2)

這里我們通過First等待t1、t2第一個返回的結果后await結束,并將第一個返回的協程的返回結果賦值給t_ret。

event

對于SystemVerilog中的event,在cocotb中同樣提供類似的event:

class cocotb.triggers.Event(name=None)

用于兩個協程間的同步

方法:

set(data=None):喚醒所有等待該事件的協程

wait(): 等待事件的出發(await),如果事件已經觸發,立即返回

clear(): 清楚以觸發的事件

is_set():判斷事件是否觸發

旗語

cocotb中提供了Lock操作用來實現與SystemVerilog中相似的操作,不過Lock不可聲明旗語為多個:

class cocotb.triggers.Lock(name=None)

方法:

locked : True if the lock is held.

acquire():Produce a trigger which fires when the lock is acquired.

release(): Release the lock.

mailbox

SystemVerilog中的mailbox主要用于不同進程間的通信,在cocotb中,普通的Python的隊列即可實現該功能(協程中無需沒有進程間同步問題)。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960
  • 語法
    +關注

    關注

    0

    文章

    45

    瀏覽量

    10644
  • 非阻塞賦值
    +關注

    關注

    0

    文章

    11

    瀏覽量

    10124

原文標題:cocotb—基礎語法對照篇

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于凌羽派的OpenHarmony北向應用開發:ArkTS語法-數據類型和變量聲明

    一、簡介ArkTS是一種設計用于構建高性能應用的編程語言。它在繼承TypeScript語法的基礎上進行了優化,以提供更高的性能和開發效率。環境配置如下所示:API:18SDK:OpenHarmony-v5.1.0-Release
    的頭像 發表于 02-26 13:55 ?192次閱讀
    基于凌羽派的OpenHarmony北向應用開發:ArkTS<b class='flag-5'>語法</b>-數據類型和變量聲明

    Lua基礎語法更新篇(上)

    。而整個Lua虛擬機編譯后僅僅一百余K,經過適當的裁剪還能做到更小,十分適合嵌入式的開發。 同時,在目前腳本引擎,Lua的運行速度占有絕對優勢。這些都決定了Lua是作為嵌入式腳本的最佳選擇。 在我們編寫代碼之前,需要做一下準備,就是: 確保你輸
    的頭像 發表于 01-23 19:56 ?82次閱讀
    Lua基礎<b class='flag-5'>語法</b>更新篇(上)

    Termux調試圣誕樹Python代碼

    在Termux調試Python代碼(以圣誕樹立例)非常簡單,核心分為環境準備、代碼編寫、運行調試三個步驟,下面一步步教你操作: 一、環境準備(首次使用需做) Termux默認可能沒有Python
    發表于 12-09 09:02

    匯編程序段的定義介紹

    指令部分)... MOVAX, 4C00H INT21H CODE ENDS ENDSTART 語法解讀: 程序開始的兩條指令都是用于裝載數據段寄存器DS的。進入程序后,代碼段寄存器CS的值
    發表于 11-21 08:19

    堆棧的定義,堆棧的使用方法

    堆棧的定義 堆棧也是用戶使用的存儲器的一部分,用于存放臨時性的數據和一些其他信息。堆棧段的定義語法如下: 堆棧名SEGMENTSTACK (堆棧內容) 堆棧名ENDS 語法解釋: 堆棧
    發表于 11-21 06:49

    語法糾錯和testbench的自動生成

    在編寫Verilog代碼時,我一般都是先在編輯器上寫完,因為編輯器vscode或者notepad++可以提供語法高亮和自動補全等功能,然后用仿真器跑仿真,但是在編寫過程不可避免的會有一些語法的錯誤
    發表于 10-27 07:07

    如何解決將e203的rtl導入vivado后報語法錯誤的問題

    主要內容是介紹一下如何解決將e203的rtl導入vivado后,報語法錯誤的問題。 二、分享內容 如圖所示,導入源碼后跑仿真,會報語法錯誤。 這是因為這些文件里面有用system verilog
    發表于 10-24 09:49

    nuclei studio生成的c語言文件是不支持c的語法嗎?

    nuclei studio 生成的c語言文件感覺不支持c的語法,因為剛使用這個軟件,還請各位大佬幫忙看看
    發表于 10-20 11:02

    程序編譯運行正常但是顯示語法錯誤,為什么?

    樣例程序:can_sample.c rtconfig.h里啟用了#define RT_CAN_USING_HDR 代碼從圖中這里開始大段標識語法錯誤: 跳轉到宏
    發表于 09-25 06:27

    termux輸出Hello termux

    的 Python 語法 Python 腳本文件只需包含純 Python 代碼,無需添加 `python` 命令或 HTML 標簽(如 ``)。錯誤信息的 `python` 導致解釋器無法識別
    發表于 08-29 12:16

    鴻蒙開發如何顯示Markdown格式語法 -- markdown_hm介紹

    在開發過程,對于內容的展示通常有富文本和Markdown兩種,后者更偏向于技術文檔、說明書一類的內容展示。但是和富文本不同的是,沒有一個原生組件可以用來解析展示Markdown語法的內容,所以
    發表于 06-30 18:47

    harmony OS NEXT-雙向數據綁定MVVM以及$$語法糖介紹

    # 鴻蒙Harmony-雙向數據綁定MVVM以及$$語法糖介紹 ## 1.1 雙向數據綁定概念 在鴻蒙(HarmonyOS)應用開發,雙向數據改變(或雙向數據綁定)是一種讓數據·模型和UI組件之間
    的頭像 發表于 04-29 16:52 ?1248次閱讀

    Python在嵌入式系統的應用場景

    你想把你的職業生涯提升到一個新的水平?Python在嵌入式系統中正在成為一股不可缺少的新力量。盡管傳統上嵌入式開發更多地依賴于C和C++語言,Python的優勢在于其簡潔的語法、豐富的庫和快速的開發周期,這使得它在某些嵌入式場景中非常有用,以下是Python在嵌入式系統
    的頭像 發表于 03-19 14:10 ?1492次閱讀

    基于鴻蒙原生ArkTS語法開發的圖表組件--柱狀圖

    大家好,我是陳楊。在上一篇文章,我簡要介紹了折線圖的實現邏輯,并解釋了整體圖表的繪制規則。根據這些規則,我們還可以繪制更多種類的圖表組件。在本期中,我將講解如何實現柱狀圖,并引入了一個新的功能
    的頭像 發表于 03-16 16:01 ?984次閱讀
    基于鴻蒙原生ArkTS<b class='flag-5'>語法</b>開發的圖表組件--柱狀圖

    在下載的源碼進入bsp目錄下的一個板子執行menuconfig報錯,怎么解決?

    在下載的源碼進入bsp目錄下的一個板子執行menuconfig報錯,如下: Kconfig:3:warning: ignoring unsupported character
    發表于 03-07 06:35