Chisel:将单独的输入和输出端口映射到 inout 引脚

Luí*_*ues 5 chisel

我从 Chisel 3 源代码生成 Verilog,并使用 UCF 文件将 Verilog 的顶部模块端口映射到 FPGA 引脚。

我的设计中有一组输入输出引脚(SDRAM 数据引脚),在 Chisel 端必须将其表示为单独的输入和输出端口。问题是,我不能(AFAIK)然后将 Verilog 输入端口和输出端口映射到同一个 FPGA 引脚(如果我直接编写 Verilog,这些将是单个输入输出信号,因此这不会成为问题)并且我不知道如何强制 Chisel 3 从两个输入/输出 Chisel 端口生成单个 Verilog 输入输出端口。

Chisel (3) 中通常如何解决这个问题?

Jac*_*nig 5

我们正在努力在 Chisel 3 中对 Verilog inout 提供一定程度的支持,但在该 API 完全充实之前,您应该编写一个 Verilog 包装器,将 inout 转换为输入、输出和某个方向。

例如,假设我有一些带有输入输出引脚的 Verilog,可用于设置或读取某个寄存器:

module Inout(
  input clock,
  input write,
  inout [31:0] data
);

  reg [31:0] value;

  assign data = (write) ? 32'dz : value;

  always @(posedge clock) begin
    if (write)
      value <= data;
    else
      value <= value;
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

通过一个简单的包装器,我可以公开一个不使用 inout 的不同接口:

module InoutWrapper(
  input clock,
  input write,
  input [31:0] dataIn,
  output [31:0] dataOut
);
  wire [31:0] bus;

  assign bus = (write)? dataIn : 32'dz;
  assign dataOut = bus;

  Inout mod (
    .clock(clock),
    .write(write),
    .data(bus)
  );
endmodule
Run Code Online (Sandbox Code Playgroud)

该包装器接口可以在 Chisel 设计中用作 BlackBox:

module Inout(
  input clock,
  input write,
  inout [31:0] data
);

  reg [31:0] value;

  assign data = (write) ? 32'dz : value;

  always @(posedge clock) begin
    if (write)
      value <= data;
    else
      value <= value;
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

这是一个额外的简单健全性测试来证明它是有效的:

module InoutWrapper(
  input clock,
  input write,
  input [31:0] dataIn,
  output [31:0] dataOut
);
  wire [31:0] bus;

  assign bus = (write)? dataIn : 32'dz;
  assign dataOut = bus;

  Inout mod (
    .clock(clock),
    .write(write),
    .data(bus)
  );
endmodule
Run Code Online (Sandbox Code Playgroud)

如果输入输出端口位于设计的顶部,您可以为设计的顶部创建类似的包装器。