Chisel3 - util - Pipe

https://mp.weixin.qq.com/s/WeFesE8k0ORxlaNfLvDzgg

流水线,用于添加延迟。

参考链接:

https://github.com/freechipsproject/chisel3/blob/master/src/main/scala/chisel3/util/Valid.scala

??

1. Pipe object提供了三个工厂方法

??

最基本的方法签名如下:

def apply[T <: Data](enqValid: Bool, enqBits: T, latency: Int)(implicit compileOptions: CompileOptions): Valid[T]

接收三个参数,返回一个Valid接口。

其中:latency为延迟的clock数,enqValid为valid位,enqBits为要输出的数据类型。

实现如下:

??

这里使用了递归调用,退出条件为latency为0。当latency为0时,不需要延时。直接把输入enqValid/enqBits输出到一个Valid类型的线。

当latency不为0时,则把enqValid和enqBits输出到一个新创建的寄存器中,以实现delay一个clock的目的,然后使用递归调用:apply(v, b, latency-1) 生成后续延时所需的寄存器。

另外两个方法基于这个方法实现:

a. 默认延时一个时钟

def apply[T <: Data](enqValid: Bool, enqBits: T)(implicit compileOptions: CompileOptions): Valid[T] = {

apply(enqValid, enqBits, 1)(compileOptions)

}

b. 延时一个Valid类型的变量

def apply[T <: Data](enq: Valid[T], latency: Int = 1)(implicit compileOptions: CompileOptions): Valid[T] = {

apply(enq.valid, enq.bits, latency)(compileOptions)

}

2. Pipe模块

Pipe模块内部定义了一个PipeIO,使用Pipe伴生对象提供的工厂方法,创建一个Valid类型的接口,用于构建Pipe模块。

??

输入接口enq是Valid类型,输出接口deq也是Valid类型,io.deq <> Pipe(io.enq, latency) 把io.enq延迟latency个时钟之后,输出到io.deq中。

PS. enq是入队的意思(enqueue), deq是出队的意思(dequeue)。

3. 附录

Valid.scala:

/** A hardware module that delays data coming down the pipeline
* by the number of cycles set by the latency parameter. Functionality
* is similar to ShiftRegister but this exposes a Pipe interface.
*
* Example usage:
* {{{
* val pipe = new Pipe(UInt())
* pipe.io.enq <> produce.io.out
* consumer.io.in <> pipe.io.deq
* }}}
*/
object Pipe
{
@chiselName
def apply[T <: Data](enqValid: Bool, enqBits: T, latency: Int)(implicit compileOptions: CompileOptions): Valid[T] = {
if (latency == 0) {
val out = Wire(Valid(chiselTypeOf(enqBits)))
out.valid := enqValid
out.bits := enqBits
out
} else {
val v = RegNext(enqValid, false.B)
val b = RegEnable(enqBits, enqValid)
apply(v, b, latency-1)(compileOptions)
}
}
def apply[T <: Data](enqValid: Bool, enqBits: T)(implicit compileOptions: CompileOptions): Valid[T] = {
apply(enqValid, enqBits, 1)(compileOptions)
}
def apply[T <: Data](enq: Valid[T], latency: Int = 1)(implicit compileOptions: CompileOptions): Valid[T] = {
apply(enq.valid, enq.bits, latency)(compileOptions)
}
}

class Pipe[T <: Data](gen: T, latency: Int = 1)(implicit compileOptions: CompileOptions) extends Module
{
class PipeIO extends Bundle {
val enq = Input(Valid(gen))
val deq = Output(Valid(gen))
}

val io = IO(new PipeIO)

io.deq <> Pipe(io.enq, latency)
}
 

原文地址:https://www.cnblogs.com/wjcdx/p/10116971.html

时间: 2024-10-12 22:01:28

Chisel3 - util - Pipe的相关文章

Chisel3 - util - Valid

https://mp.weixin.qq.com/s/L5eAwv--WzZdr-CfW2-XNA Chisel提供的Valid接口.如果valid为置1,则表明输出的bits有效:反之,则输出无效. 参考链接: https://github.com/freechipsproject/chisel3/blob/master/src/main/scala/chisel3/util/Valid.scala ?? 1. Valid是一组用户自定义的输入输出接口 类的声明如下: class Valid[

Chisel3 - util - RRArbiter

https://docs.qq.com/doc/DUWtwcWZlYm5DWG9n 循环优先级(Round Robin)仲裁器. 参考链接: https://github.com/freechipsproject/chisel3/blob/master/src/main/scala/chisel3/util/Arbiter.scala RRArbiter是一个仲裁器,只是使用RR的逻辑实现优先级.grant是优先级逻辑的结果,所以实现RRArbiter与严格优先级Arbiter的区别在于(仅在于

Chisel3 - Tutorial - Adder4

https://mp.weixin.qq.com/s/X5EStKor2DU0-vS_wIO-fg 四位加法器.通过FullAdder级联实现. 参考链接: https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Adder4.scala 1. 引入Chisel3 ?? 2. 继承自Module类 ?? 3. 定义输入输出接口 ?? 创建输入和输出接口: 这些接口都是无符号整型数:val A

oacore的application log报broken pipe

后台oacore的application log常常报这样的错误 14/06/26 09:28:34.917 html: Servlet error java.io.IOException: Broken pipe at sun.nio.ch.FileDispatcher.write0(Native Method) at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29) at sun.nio.ch.IOUtil.writeFr

Node.js API —— util(工具)

// 说明 Node API 版本为 v0.10.31.    中文参考:http://nodeapi.ucdok.com/#/api/,http://blog.sina.com.cn/oleoneoy 本段为博主注解. 目录 ● 工具    ○ util.format(format, [...]) ○ util.debug(string) ○ util.error([...]) ○ util.puts([...]) ○ util.print([...]) ○ util.log(string)

Hive中使用Python实现Transform时遇到Broken pipe错误排查

Hive中有一表,列分隔符为冒号(:),有一列utime是Timestamp格式,需要转成Weekday存到新表. 利用Python写一个Pipeline的Transform,weekday.py的代码也很简单: import sys import datetime for line in sys.stdin: line=line.strip() uid,mid,rating,utime=line.split(':') weekday=datetime.datetime.fromtimestam

管道Pipe

管道Pipe java.nio.channels包中含有一个名为Pipe(管道)的类.广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管.管道的概念对于Unix(和类Unix)操作系统的用户来说早就很熟悉了.Unix系统中,管道被用来连接一个进程的输出和另一个进程的输入.Pipe类实现一个管道范例,不过它所创建的管道是进程内(在Java虚拟机进程内部)而非进程间使用的. 参见图3-10. /* * @(#)Pipe.java 1.21 05/11/17 * * Copyright 200

java.net.SocketException: Broken pipe 异常可能的原因

org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:410) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480) at o

错误号org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

在说这个错误之前,我先介绍下背景,我们项目用的是SpringBoot框架,集成Hprose+spring+mybatis,Hprose是什么,可以参考我上篇对Hprose的一个简单介绍.当前项目业务是抓取一个网站近5年的足球篮球的赔率数据.所以这是个按照日期进行的一个大循环.介于Hprose特性,Hprose服务端的处理时间会特别长,这是个重点. 在项目上线抓取数据时,linux环境下,我们的程序出现了这样一个错误,如下: 2016-06-16 12:47:52.190 WARN 10150 -