我从 Chisel 3 源代码生成 Verilog,并使用 UCF 文件将 Verilog 的顶部模块端口映射到 FPGA 引脚。
我的设计中有一组输入输出引脚(SDRAM 数据引脚),在 Chisel 端必须将其表示为单独的输入和输出端口。问题是,我不能(AFAIK)然后将 Verilog 输入端口和输出端口映射到同一个 FPGA 引脚(如果我直接编写 Verilog,这些将是单个输入输出信号,因此这不会成为问题)并且我不知道如何强制 Chisel 3 从两个输入/输出 Chisel 端口生成单个 Verilog 输入输出端口。
Chisel (3) 中通常如何解决这个问题?
我们正在努力在 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)
如果输入输出端口位于设计的顶部,您可以为设计的顶部创建类似的包装器。