1

我想使用模块参数作为 Vector 的大小参数,其中包含寄存器,我尝试下一个代码:

package Test;
import Vector      :: *;
(* synthesize *)
module mkTest #(
  parameter UInt#(32) qsize
) (Empty);
  Vector#(qsize,Reg#(Bit#(8))) queue <- replicateM (mkReg (0));
endmodule
endpackage

但是用 bsc 编译这个模块我得到下一条错误消息:

Verilog generation
bsc -verilog -remove-dollar Test.bsv
Error: "Test.bsv", line 9, column 11: (T0008)
  Unbound type variable `qsize'

bsc 版本:

Bluespec Compiler (build e55aa23)

如果我使用 not Registers 作为一种 Vector 元素,一切正常。下一个代码不会产生错误:

package Test;
import Vector      :: *;
(* synthesize *)
module mkTest #(
  parameter UInt#(32) qsize
) (Empty);
  Vector#(qsize,Bit#(8)) queue = replicate(0);
endmodule
endpackage

我无法理解,为什么qsizeUnbound被明确声明为参数?如果我做错了什么,请你帮我解释一下,如何正确地制作 Regs 的参数化大小向量?

4

1 回答 1

2

我在 github 上的一个 Bluespec 存储库中提出了这个问题,Rishiyur S. Nikhil 给了我一个非常完整的解释。见https://github.com/BSVLang/Main/issues/4

简而言之:作为第一个参数的 Vector 需要一个类型,而不是 UInt(或 Int 或其他东西)。所以正确的做法是:

  1. 为模块创建一个接口并使其具有类型多态性
  2. 使用该接口中的类型作为向量大小参数
package Test;
import Vector      :: *;

interface Queue_IFC #(numeric type qsize_t);
  method Bool done;
endinterface

module mkQueue ( Queue_IFC #(qsize_t) );
  Vector #(qsize_t, Reg #(Bit #(8))) queue <- replicateM (mkReg (0));
endmodule

endpackage
于 2020-03-12T06:36:45.377 回答