》spawn
在Stage中,關(guān)于spawn,定義了下面的兩個(gè)API:
defspawnIt()(implicit loc: Location):Unit = spawnIt(ConditionalContext.isTrue) defspawnIt(cond : Bool)(implicit loc: Location):Unit = internals.request.spawns += nameFromLocation(CombInit(cond), "spawnRequest")
spawn的調(diào)用,最終會(huì)把觸發(fā)條件cond存儲(chǔ)至internals.request.spawns中去。
而在Pipeline中,internal.request.spawns僅使用在了Internal Connection中:
//Internal connections for(s <- stagesSet){ ??????s.output.valid := s.input.valid ??????if(s.request.spawns.nonEmpty){ ????????when(s.request.spawns.orR){ ??????????s.output.valid := True ????????} ??????}
可以看到,對(duì)于Stage內(nèi)部,若果spawns非空,則spawns中只要有一個(gè)條件成立那么其output.valid即會(huì)設(shè)置為True,相當(dāng)于對(duì)output.valid進(jìn)行了擴(kuò)展多個(gè)時(shí)鐘周期。
值得注意的是,其僅對(duì)valid進(jìn)行了擴(kuò)展,而并沒有處理input.ready信號(hào)。
看到這里,對(duì)于spawnIt的用法諸君應(yīng)該能大體看明白,其就是為了對(duì)Stage中的output.valid進(jìn)行延展。
》example
由于spawnIt并沒有對(duì)input.ready進(jìn)行處理,故如果pipeline中如果有ready信號(hào)時(shí)使用需謹(jǐn)慎,這里給出一個(gè)pipeline中不使用ready的example:
caseclass SpawnTest() extends Component{ val io=newBundle{ val data_in= slave (Flow(UInt(8bits))) val data_out= master(Flow(UInt(8bits))) } noIoPrefix() val cycle_num=Stageable(UInt(8bits)) val pip=newPipeline{ val stage0=newStage{ importinternals._ input.valid:=io.data_in.valid cycle_num:=io.data_in.payload } val stage1=newStage(Connection.M2S()){} val stage2=newStage(Connection.M2S()){ io.data_out.valid:=internals.output.valid val cycle_cnt=Reg(UInt(8bits)) init(0) when(internals.input.valid){ cycle_cnt:=(cycle_num===1)?cycle_cnt|(cycle_num-1) io.data_out.payload:=cycle_num }otherwise{ cycle_cnt:= (cycle_cnt.orR)? (cycle_cnt-1)|cycle_cnt io.data_out.payload:=cycle_cnt } spawnIt(cycle_cnt=/=0) } } pip.build() }
這個(gè)例子中pipeline存在三個(gè)Stage,對(duì)于data_in,在stage2中會(huì)對(duì)根據(jù)data_in.payload的值展開相應(yīng)的拍數(shù)(兩個(gè)data_in有效數(shù)據(jù)確保有足夠的間隔),示例波形如下:
可以看到,當(dāng)data_in_payload為1時(shí),data_out_payload輸出一拍,數(shù)據(jù)為1.當(dāng)data_in_payload為2時(shí),data_out_payload輸出兩拍,數(shù)據(jù)分別為2,1.當(dāng)data_in_payload為3時(shí),data_out_payload輸出三拍,數(shù)據(jù)分別為1,2,3.實(shí)現(xiàn)data_in.valid的擴(kuò)展。
附上仿真代碼:
importspinal.core.sim._ object SpawnTestSim extends App{ SimConfig.withFstWave.compile(SpawnTest()).doSim{dut=> dut.io.data_in.valid#=false dut.clockDomain.forkStimulus(10) dut.clockDomain.waitSampling(10) dut.io.data_in.valid#=true dut.io.data_in.payload#=1 dut.clockDomain.waitSampling() dut.io.data_in.valid#=false for(index<-0?until?10){ ??????dut.io.data_in.payload#=index ??????dut.clockDomain.waitSampling() ????} ????dut.io.data_in.valid#=true ????dut.io.data_in.payload#=2 ????dut.clockDomain.waitSampling() ????dut.io.data_in.valid#=false ????for(index<-0?until?10){ ??????dut.io.data_in.payload#=index ??????dut.clockDomain.waitSampling() ????} ????dut.io.data_in.valid#=true ????dut.io.data_in.payload#=3 ????dut.clockDomain.waitSampling() ????dut.io.data_in.valid#=false ????for(index<-0?until?10){ ??????dut.io.data_in.payload#=index ??????dut.clockDomain.waitSampling() ????} ??} }
審核編輯:劉清
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7521瀏覽量
164093 -
仿真器
+關(guān)注
關(guān)注
14文章
1019瀏覽量
83844 -
Pipeline
+關(guān)注
關(guān)注
0文章
28瀏覽量
9372
原文標(biāo)題:pipeline高端玩法(十一)—spawnIt
文章出處:【微信號(hào):Spinal FPGA,微信公眾號(hào):Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論