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ǔ)法與SystemVerilog中的常用語(yǔ)法對(duì)照總結(jié)

FPGA之家 ? 來(lái)源:Spinal FPGA ? 作者:玉騏 ? 2022-07-21 09:07 ? 次閱讀

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

返回類型: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ě):

#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)度是依賴于仿真器的,因此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ě):


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ě):

這里值得注意的是,由于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:

使用方式:


fork-any

相較于SystemVerilog中的join-any語(yǔ)法,cocotb并無(wú)專門(mén)的對(duì)應(yīng)語(yǔ)法,但卻有相似的方法供調(diào)用:

class cocotb.triggers.First(*triggers)

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

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

event

對(duì)于SystemVerilog中的event,在cocotb中同樣提供類似的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)注

    14

    文章

    1018

    瀏覽量

    83752
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59797
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84694
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    VHDL語(yǔ)言的常用語(yǔ)法

    VHDL語(yǔ)言的常用語(yǔ)法[學(xué)習(xí)要求] 掌握VHDL硬件描述語(yǔ)言的基本描述語(yǔ)句。并可以利用這些語(yǔ)句進(jìn)行簡(jiǎn)單電路的設(shè)計(jì)。[重點(diǎn)與難點(diǎn)]重點(diǎn):常用的并行語(yǔ)句與順序語(yǔ)句的語(yǔ)法。難點(diǎn):部件(Component
    發(fā)表于 03-19 16:45

    PCB常用語(yǔ)匯總

    PCB常用語(yǔ)匯總
    發(fā)表于 11-13 12:03

    linux的常用命令總結(jié)

    授之以漁:了解命令學(xué)習(xí)方法、用途:不再死記硬背,拒絕漫無(wú)目的;準(zhǔn)確無(wú)誤:所有命令執(zhí)行通過(guò)(環(huán)境為centos7),拒絕復(fù)制粘貼;實(shí)用性高:命令多為實(shí)際工作中用到的,實(shí)例講解,拒絕純理論;條理清晰:分類歸納,快速找到想要的命令,拒絕天馬行空;總結(jié)性強(qiáng):只列常用語(yǔ)法,易錯(cuò)情況
    發(fā)表于 07-17 07:42

    labsql ADO 常用語(yǔ)句命令

    labsqlADO 常用語(yǔ)句命令
    發(fā)表于 08-14 16:21

    verilog HDL語(yǔ)法總結(jié)

    verilog HDL語(yǔ)法總結(jié)
    發(fā)表于 03-16 14:26

    單片機(jī)C語(yǔ)言編程常用語(yǔ)句有哪些?

    單片機(jī)C語(yǔ)言編程常用語(yǔ)句有哪些?
    發(fā)表于 10-21 08:45

    Linux內(nèi)核GNU C擴(kuò)展的一些常用C語(yǔ)言語(yǔ)法分析

    13.1 總結(jié)前面12節(jié)的課程,主要針對(duì) Linux 內(nèi)核 GNU C 擴(kuò)展的一些常用 C 語(yǔ)言語(yǔ)法進(jìn)行了分析。GNU C 的這些擴(kuò)展語(yǔ)法
    發(fā)表于 12-14 06:29

    【使用指南】Markdown編輯器常用語(yǔ)法功能

    基本語(yǔ)法 一些常規(guī)的語(yǔ)法格式。 1.1 標(biāo)題 標(biāo)題用#+空格表示,不同數(shù)量的#可以表示不同的標(biāo)題。建議帖子或回帖的頂級(jí)標(biāo)題使用Heading3,不要使用1或2,因?yàn)?是系統(tǒng)站點(diǎn)級(jí),2是帖子標(biāo)題級(jí)。示例
    發(fā)表于 05-13 19:40

    VHDL語(yǔ)言的常用語(yǔ)法

    [學(xué)習(xí)要求] 掌握VHDL硬件描述語(yǔ)言的基本描述語(yǔ)句。并可以利用這些語(yǔ)句進(jìn)行簡(jiǎn)單電路的設(shè)計(jì)。[重點(diǎn)與難點(diǎn)]重點(diǎn):常用的并行語(yǔ)句與順序語(yǔ)句的語(yǔ)法。難點(diǎn):部件(Component
    發(fā)表于 03-18 22:03 ?100次下載

    SQL、LINQ、Lambda語(yǔ)法對(duì)照

    本文檔內(nèi)容介紹了基于SQL、LINQ、Lambda語(yǔ)法對(duì)照圖,供參考
    發(fā)表于 02-27 17:03 ?8次下載

    關(guān)于verilog的學(xué)習(xí)經(jīng)驗(yàn)簡(jiǎn)單分享

    學(xué)習(xí)verilog最重要的不是語(yǔ)法,“因?yàn)?0%的語(yǔ)法就能完成90%的工作”,verilog語(yǔ)言常用語(yǔ)言就是always@(),if~else,case,assign這幾個(gè)了。
    發(fā)表于 03-26 14:06 ?2885次閱讀
    關(guān)于verilog的學(xué)習(xí)經(jīng)驗(yàn)簡(jiǎn)單分享

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

    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后最直觀的方式便是我們能夠建立
    的頭像 發(fā)表于 07-21 09:18 ?2441次閱讀

    SQL語(yǔ)句的常用語(yǔ)法公式和常見(jiàn)的面試題目

    數(shù)據(jù)庫(kù)的相關(guān)SQL查詢語(yǔ)句是軟件測(cè)試工程師面試的一大重點(diǎn),也是很多小伙伴面試中覺(jué)得比較困難的知識(shí)點(diǎn)。下面小編總結(jié)出一些SQL語(yǔ)句的常用語(yǔ)法公式和常見(jiàn)的面試題目。
    的頭像 發(fā)表于 11-07 10:10 ?1316次閱讀

    SystemVerilog至關(guān)重要的結(jié)構(gòu)體和自定義類型

    在上一篇文章《SystemVerilog至關(guān)重要的的數(shù)據(jù)類型》,介紹了枚舉類型的本質(zhì)和使用語(yǔ)法。本文接著介紹SV同樣不可忽略的結(jié)構(gòu)體(
    的頭像 發(fā)表于 01-21 17:18 ?2219次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>至關(guān)重要的結(jié)構(gòu)體和自定義類型

    MySQL常用語(yǔ)

    MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),廣泛應(yīng)用于Web應(yīng)用程序的開(kāi)發(fā)以及數(shù)據(jù)管理領(lǐng)域。在使用MySQL時(shí),有一些常用的語(yǔ)句可以幫助我們進(jìn)行數(shù)據(jù)的操作和管理。接下來(lái),我將詳細(xì)介紹MySQL的常用語(yǔ)
    的頭像 發(fā)表于 11-21 11:11 ?518次閱讀