日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

cocotb中的基礎(chǔ)語(yǔ)法

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

掃碼添加小助手

加入工程師交流群

cocotb的出現(xiàn)使得我們能夠在做RTL仿真驗(yàn)證時(shí)依托Python來(lái)進(jìn)行測(cè)試用例的構(gòu)建,當(dāng)我們習(xí)慣了用Verilog、SystemVerilog來(lái)構(gòu)建測(cè)試用例時(shí),切換到cocotb后最直觀的方式便是我們能夠建立cocotb中的基礎(chǔ)語(yǔ)法與SystemVerilog中仿真常用的關(guān)鍵字又一個(gè)對(duì)應(yīng),能夠使我們又一個(gè)初步的對(duì)照。本篇就cocotb中的基礎(chǔ)語(yǔ)法與SystemVerilog中的常用語(yǔ)法做一個(gè)對(duì)照總結(jié)。

非阻塞賦值

在使用Systemverilog進(jìn)行仿真時(shí),對(duì)于接口信號(hào),往往建議采用非阻塞賦值進(jìn)行操作,其符號(hào)為“<=”.

在cocotb中,對(duì)于信號(hào)的賦值,其提供相應(yīng)的非阻塞賦值方式,其符號(hào)也同樣為“<=”。

在cocotb的手冊(cè)里提到:

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中這樣來(lái)進(jìn)行非阻塞賦值:

# 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

阻塞賦值

針對(duì)阻塞賦值(立即生效),cocotb提供了相應(yīng)的語(yǔ)法:

setimmediatevalue(value)

因而對(duì)于阻塞賦值,我們?cè)赾ocotb中可以這樣寫(xiě):

dut.input_signal.setimmediatevalue(1)

信號(hào)值讀取

對(duì)于信號(hào)的讀取,我們?cè)赟ystemVerilog中,可以直接讀取信號(hào)值,而在cocotb中,其為接口變量提供了value方法屬性用于獲取信號(hào)值。

讀取方式:sig.value

返回類(lèi)型: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.

信號(hào)的讀取我們可以這么來(lái)寫(xiě):

# 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

在仿真里延遲等待是經(jīng)常遇到的,在cocotb里,我們通過(guò)Timer來(lái)實(shí)現(xiàn)延遲:

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是基于協(xié)程的,而延遲函數(shù)的執(zhí)行的時(shí)間長(zhǎng)度是依賴(lài)于仿真器的,因此Timer延遲的執(zhí)行需調(diào)用await:

await Timer(1, units='ns')

邊沿檢測(cè)

在SystemVerilog中我們常用posedge、negedge來(lái)檢測(cè)上升沿和下降沿,在cocotb里,針對(duì)邊沿檢測(cè),其提供了四個(gè)調(diào)用:

等待調(diào)變

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.

檢測(cè)等待指定到個(gè)數(shù)邊沿

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.

我們?cè)谑褂脮r(shí),可以這么來(lái)寫(xiě):

#等待信號(hào)signalA發(fā)生變化await cocotb.triggers.Edge(dut.signalA)#等待signalA從0變?yōu)?await cocotb.triggers.RisingEdge(dut.signalA)#等待signalA從1變?yōu)?await cocotb.triggers.FallingEdge(dut.signalA)#等待signalA從0變?yōu)?三次awaitcocotb.triggers.ClockCycles(dut.signalA,3,true)

fork-join_none

SystemVerilog中的fork-join_none用于發(fā)起一個(gè)線程但不等待線程的結(jié)束,在cocotb中,相應(yīng)的語(yǔ)法為fork:

cocotb.fork()

Schedule a coroutine to be run concurrently

在寫(xiě)仿真代碼時(shí),我們可以這么寫(xiě):

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是起一個(gè)協(xié)程,因而resut_dut需添加async聲明。

fork-join

與SystemVerilog中相對(duì)應(yīng)的,cocotb等待一個(gè)協(xié)程的結(jié)束同樣提供了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語(yǔ)法,cocotb并無(wú)專(zhuān)門(mén)的對(duì)應(yīng)語(yǔ)法,但卻有相似的方法供調(diào)用:

class cocotb.triggers.First(*triggers)

等待第一個(gè)協(xié)程結(jié)束即返回

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

這里我們通過(guò)First等待t1、t2第一個(gè)返回的結(jié)果后await結(jié)束,并將第一個(gè)返回的協(xié)程的返回結(jié)果賦值給t_ret。

event

對(duì)于SystemVerilog中的event,在cocotb中同樣提供類(lèi)似的event:

class cocotb.triggers.Event(name=None)

用于兩個(gè)協(xié)程間的同步

方法:

set(data=None):?jiǎn)拘阉械却撌录膮f(xié)程

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

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

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

旗語(yǔ)

cocotb中提供了Lock操作用來(lái)實(shí)現(xiàn)與SystemVerilog中相似的操作,不過(guò)Lock不可聲明旗語(yǔ)為多個(gè):

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主要用于不同進(jìn)程間的通信,在cocotb中,普通的Python的隊(duì)列即可實(shí)現(xiàn)該功能(協(xié)程中無(wú)需沒(méi)有進(jìn)程間同步問(wèn)題)。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74417
  • 語(yǔ)法
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    10691
  • 非阻塞賦值
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    10131

原文標(biāo)題:cocotb—基礎(chǔ)語(yǔ)法對(duì)照篇

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Verilog HDL語(yǔ)法學(xué)習(xí)筆記

    Verilog HDL 語(yǔ) 言 最 初 是 作為 Gateway Design Automation 公 司 ( Gateway DesignAutomation 公司后來(lái)被著名的 Cadence Design Systems 公司收購(gòu))模擬器產(chǎn)品開(kāi)發(fā)的硬件建模語(yǔ)言。
    的頭像 發(fā)表于 03-04 15:04 ?5822次閱讀
    Verilog HDL<b class='flag-5'>語(yǔ)法</b>學(xué)習(xí)筆記

    基于凌羽派的OpenHarmony北向應(yīng)用開(kāi)發(fā):ArkTS語(yǔ)法-數(shù)據(jù)類(lèi)型和變量聲明

    一、簡(jiǎn)介ArkTS是一種設(shè)計(jì)用于構(gòu)建高性能應(yīng)用的編程語(yǔ)言。它在繼承TypeScript語(yǔ)法的基礎(chǔ)上進(jìn)行了優(yōu)化,以提供更高的性能和開(kāi)發(fā)效率。環(huán)境配置如下所示:API:18SDK:OpenHarmony-v5.1.0-Release
    的頭像 發(fā)表于 02-26 13:55 ?422次閱讀
    基于凌羽派的OpenHarmony北向應(yīng)用開(kāi)發(fā):ArkTS<b class='flag-5'>語(yǔ)法</b>-數(shù)據(jù)類(lèi)型和變量聲明

    Lua基礎(chǔ)語(yǔ)法更新篇(上)

    。而整個(gè)Lua虛擬機(jī)編譯后僅僅一百余K,經(jīng)過(guò)適當(dāng)?shù)牟眉暨€能做到更小,十分適合嵌入式的開(kāi)發(fā)。 同時(shí),在目前腳本引擎,Lua的運(yùn)行速度占有絕對(duì)優(yōu)勢(shì)。這些都決定了Lua是作為嵌入式腳本的最佳選擇。 在我們編寫(xiě)代碼之前,需要做一下準(zhǔn)備,就是: 確保你輸
    的頭像 發(fā)表于 01-23 19:56 ?199次閱讀
    Lua基礎(chǔ)<b class='flag-5'>語(yǔ)法</b>更新篇(上)

    Termux調(diào)試圣誕樹(shù)Python代碼

    在Termux調(diào)試Python代碼(以圣誕樹(shù)立例)非常簡(jiǎn)單,核心分為環(huán)境準(zhǔn)備、代碼編寫(xiě)、運(yùn)行調(diào)試三個(gè)步驟,下面一步步教你操作: 一、環(huán)境準(zhǔn)備(首次使用需做) Termux默認(rèn)可能沒(méi)有Python
    發(fā)表于 12-09 09:02

    C語(yǔ)言中除數(shù)為0屬于什么錯(cuò)誤

    0 的錯(cuò)誤,以及援引數(shù)組元素時(shí)下標(biāo)溢出等。 靜態(tài)錯(cuò)誤又可以分為語(yǔ)法錯(cuò)誤和靜態(tài)語(yǔ)義錯(cuò)誤。語(yǔ)法錯(cuò)誤指有關(guān)語(yǔ)言結(jié)構(gòu)上的錯(cuò)誤,如單詞拼寫(xiě)錯(cuò)誤、表達(dá)式缺少操作數(shù)、括號(hào)不匹配等。靜態(tài)語(yǔ)義錯(cuò)誤指語(yǔ)言意義上錯(cuò)誤,如加法運(yùn)算的兩個(gè)錯(cuò)作數(shù)一個(gè)為
    發(fā)表于 12-08 06:38

    匯編程序段的定義介紹

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

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

    堆棧的定義 堆棧也是用戶(hù)使用的存儲(chǔ)器的一部分,用于存放臨時(shí)性的數(shù)據(jù)和一些其他信息。堆棧段的定義語(yǔ)法如下: 堆棧名SEGMENTSTACK (堆棧內(nèi)容) 堆棧名ENDS 語(yǔ)法解釋?zhuān)? 堆棧
    發(fā)表于 11-21 06:49

    RISC-V的工具鏈GCC內(nèi)聯(lián)匯編

    \", \"r2\" ); 總結(jié) 匯編語(yǔ)言抽象層次低,但程序編寫(xiě)難度大。我們?cè)趯?shí)際工程編寫(xiě)可以去閱讀完整的GNU匯編語(yǔ)法手冊(cè),里面有語(yǔ)法介紹可以進(jìn)行學(xué)習(xí)與借鑒。
    發(fā)表于 10-30 06:59

    語(yǔ)法糾錯(cuò)和testbench的自動(dòng)生成

    在編寫(xiě)Verilog代碼時(shí),我一般都是先在編輯器上寫(xiě)完,因?yàn)榫庉嬈鱲scode或者notepad++可以提供語(yǔ)法高亮和自動(dòng)補(bǔ)全等功能,然后用仿真器跑仿真,但是在編寫(xiě)過(guò)程不可避免的會(huì)有一些語(yǔ)法的錯(cuò)誤
    發(fā)表于 10-27 07:07

    如何解決將e203的rtl導(dǎo)入vivado后報(bào)語(yǔ)法錯(cuò)誤的問(wèn)題

    主要內(nèi)容是介紹一下如何解決將e203的rtl導(dǎo)入vivado后,報(bào)語(yǔ)法錯(cuò)誤的問(wèn)題。 二、分享內(nèi)容 如圖所示,導(dǎo)入源碼后跑仿真,會(huì)報(bào)語(yǔ)法錯(cuò)誤。 這是因?yàn)檫@些文件里面有用system verilog
    發(fā)表于 10-24 09:49

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

    nuclei studio 生成的c語(yǔ)言文件感覺(jué)不支持c的語(yǔ)法,因?yàn)閯偸褂眠@個(gè)軟件,還請(qǐng)各位大佬幫忙看看
    發(fā)表于 10-20 11:02

    程序編譯運(yùn)行正常但是顯示語(yǔ)法錯(cuò)誤,為什么?

    樣例程序:can_sample.c rtconfig.h里啟用了#define RT_CAN_USING_HDR 代碼從圖中這里開(kāi)始大段標(biāo)識(shí)語(yǔ)法錯(cuò)誤: 跳轉(zhuǎn)到宏
    發(fā)表于 09-25 06:27

    termux輸出Hello termux

    的 Python 語(yǔ)法 Python 腳本文件只需包含純 Python 代碼,無(wú)需添加 `python` 命令或 HTML 標(biāo)簽(如 ``)。錯(cuò)誤信息的 `python` 導(dǎo)致解釋器無(wú)法識(shí)別
    發(fā)表于 08-29 12:16

    鴻蒙開(kāi)發(fā)如何顯示Markdown格式語(yǔ)法 -- markdown_hm介紹

    在開(kāi)發(fā)過(guò)程,對(duì)于內(nèi)容的展示通常有富文本和Markdown兩種,后者更偏向于技術(shù)文檔、說(shuō)明書(shū)一類(lèi)的內(nèi)容展示。但是和富文本不同的是,沒(méi)有一個(gè)原生組件可以用來(lái)解析展示Markdown語(yǔ)法的內(nèi)容,所以
    發(fā)表于 06-30 18:47

    如何使用Traceroute命令

    以下是如何使用 traceroute 命令的詳細(xì)指南,包括其語(yǔ)法、選項(xiàng)和實(shí)際示例。
    的頭像 發(fā)表于 06-04 11:28 ?2558次閱讀
    华容县| 阜城县| 宁陕县| 邵阳县| 泸定县| 临桂县| 余干县| 赞皇县| 体育| 韩城市| 辰溪县| 郯城县| 西峡县| 泽普县| 鄱阳县| 德阳市| 隆化县| 宁南县| 新乐市| 鄂州市| 石柱| 左云县| 黑龙江省| 攀枝花市| 灵石县| 循化| 策勒县| 成安县| 翼城县| 青海省| 历史| 瑞丽市| 广南县| 兴国县| 安丘市| 常熟市| 武清区| 射洪县| 普兰店市| 织金县| 翁牛特旗|