- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 Vec[Mem] 来说,集合关联缓存会很好。
不幸的是 Chisel 不支持 Vec[Mem] 构造:
val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true )}
确实:
inferred type arguments [Chisel.Mem[cache.TagType]] do not conform to method fill's type parameter bounds [T <: Chisel.Data]
[error] Error occurred in an application involving default arguments.
[error] val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true )}
[error] ^
[error] /home/asamoilov/work/projects/my-chisel/Cache.scala:139: type mismatch;
[error] found : Chisel.Mem[cache.TagType]
[error] required: T
[error] Error occurred in an application involving default arguments.
[error] val tag_ram2 = Vec.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true )}
然而,一个简单的解决方法就可以了:
val tag_ram2 = Array.fill(num_ways) {Mem(new TagType(), num_sets , seqRead = true )}
[...]
is (read_tag) {
set_idx := req_idx % UInt(num_sets) // FIXME
for (way_no <- 0 until num_ways) {
tag_read_vec(way_no) := tag_ram2(way_no)(set_idx)
}
controller_state := compare_tag
}
并用于编写标签(在某些 when(...) 子句下)
for (way_no <- 0 until num_ways) {
when (UInt(way_no) === way_idx) {
printf("writing to way %d set %d tag %x\n", way_idx, set_idx, tag_write.toBits)
tag_ram2(way_no)(set_idx) := tag_write
}
}
意见,改进建议方案的建议?谢谢!
最佳答案
对于标签数组,尝试使用宽度为 (n_tag_sz*n_ways) 的一维位向量。在缓存访问中,您无论如何都要读出整行,并且您希望将其存储在尽可能密集的地方。所以像这样:
val tag_array = Mem(Bits(width = tagbits*n_ways), n_sets, seqRead = true)
下面是一段用于 i-cache 的内存库的伪代码,它涵盖了 ifgen、ic_access 和 ic_response 的 3 个周期(s0、s1、s2):
val s1_tag_match = Vec.fill(n_ways){Bool()}
val s2_tag_hit = Vec.fill(n_ways){Bool()}
val s2_dout = Vec.fill(n_ways){Reg(Bits())}
for (i <- 0 until n_ways)
{
// notice each cycle of refill gets its own line
val data_array = Mem(Bits(width = n_code_width), n_sets*REFILL_CYCLES, seqRead = true)
val s1_raddr = Reg(UInt())
// refill
when (io.mem.resp.valid && repl_way === UInt(i))
{
data_array(Cat(s2_idx,rf_cnt)) := io.mem.resp.bits.data
}
// read enable
.elsewhen (s0_valid)
{
s1_raddr := s0_raddr
}
// read
when (s1_valid && s1_tag_match(i) && ready)
{
s2_dout(i) := data_array(s1_raddr)
}
}
io.resp.bits.data := Mux1H(s2_tag_hit, s2_dout)
关于scala - 在 Chisel 中使用 Vec[Mem] 会很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659346/
这是在凿子库里面 object Module { // returns a new Module of type T, initialized with a Parameters instance
基本上我想开始对 Chisel/FIRRTL 的内部进行黑客攻击。如果有人能指出我可以开始研究的地方,那将会有所帮助。 我已经阅读了源代码。到目前为止,我了解到 Chisel 已作为 Scala 库实
我有一个通常不需要的可选功能。然而,为了支持此功能,一些 I/O 端口应添加到原始模块 I/O 端口。 我是这样做的: import Chisel._ class TestModule extends
如果我们以下面的代码摘录为例(在模块的顶部): val write_indices = WireInit(VecInit(Seq.fill(wordsPerBeat)(0.U((log2Ceil(nW
我希望在 Chisel3 中编写计数器,用于寻址子单元。如果计数器与子单元中的某个寄存器匹配,则子单元触发,否则不触发。 我宁愿用格雷码而不是二进制来循环地址。在 Chisel 中编写二进制计数器很容
我是 Chisel 的新手,我想知道是否可以在 Chisel 开始设计任何电路之前在软件中计算常量。例如,我有一个带有一个参数的模块,myParameter,但是我想从这个参数中导出更多变量(cons
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
使用 > 运算符实现逻辑移位很容易,但是算术右移(符号扩展)如何在 Chisel 中实现呢? 在 Chisel 备忘单中提到 >> 运算符用于算术右移,与逻辑右移运算符相同。 最佳答案 我认为如果类型
在 Chisel iotesters 中,我们将创建 Chisel 设计的工厂传递给测试仪,例如() => 新建DUT,如下: "Test" should "simulate" in { chis
我有一些类似的寄存器定义,我想写在 regmap 结构下。 我的代码目前看起来像这样: val regs = RegInit(Vec(Seq.fill(5)(0.U(32.W)))) regmap (
我有以下测试代码并使用 --genHarness 调用 chiseMain。 Verilog 是为线束生成的,但它不包含 Tester 类中的任何逻辑。关于为什么我没有得到我期望的逻辑有什么想法吗?我
我正在尝试使用 chisel Queue 类并希望能够在重置时刷新它。好像以前Class的构造函数里面有reset的选项 @deprecated("Module constructor with ov
我正在生成要由 Chisel 编译的输入。以简单的方式进行操作可能会导致 bool 表达式不理想。例如,我倾向于生成嵌套的 Mux()-es 链,如下所示: x := Mux(!a &&
如何动态地将输入或输出添加到 Bundle 以实现与此伪代码等效的效果。 class MyBundle extends Bundle { for( i = UInt(i.W) } } 请注意
我在凿子代码中遇到以下异常。 [info] - should correctly write and read data *** FAILED *** [info] chisel3.core.Bi
我一直在研究 Chisel 以及各种 Lavas(Kansas、Chalmers 和 Xilinx 口味)和 CLaSH 的来源。我试图了解 Chisel 与其他产品的主要卖点是什么。我发现的主要方法
我为我的特定数据声明了一个 Bundle : class RValue (val cSize: Int = 16) extends Bundle { val rvalue = Output(UIn
我想从存储在 scala 变量中的规范生成模块 IO 接口(interface)。 我想生成这个类定义: class AddIfc extends Module { val io = IO(ne
这就是我想要完成的事情:我有一个 Chisel 加速器,它调用另一个 Chisel 加速器并传入一个值。我希望第二个在其中有一个 while 循环,其中条件部分基于输入值。下面是一些示例代码: cla
我正在尝试获取 UInt 向量中 Max 元素的索引。我的代码看起来像这样 val pwr = Vec.tabulate(N) {i => energyMeters(i).io.pwr} val ma
我是一名优秀的程序员,十分优秀!