这是我的问题。 我有未知数量的输入(均为3位宽),具体取决于系统配置。我想设计一个解码器来选择输出值最大的输入。所以我在这里使用嵌入式ruby,以便配置可以传递给RTL。 这是我的设计:
代码:
module decoder
(
<% (1...NUM_INPUT).each do |i| -%>
input [2:0] freq_<%=i%>,
<% end -%>
output [2:0] decoded_freq
)
<% (1...NUM_INPUT-1).each do |i| -%>
wire [2:0] x<%=i%>,
<% end -%>
integer i;
//decode logic below
assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one
for (i=1; i<NUM_INPUT-1;i++) //for-loop to do the rest
x<%=i+1%> = (x<%=i%> > freq_<%=i+2%>)? x<%=i%>:freq_<%=i+2%>;
assign decoded_freq = x<%=NUM_INPUT-1%>;
endmodule
这会有用吗?我不确定这里的for循环。它会按我的意愿运作吗?还有其他办法吗?
答案 0 :(得分:1)
优秀的使用erb来模板化verilog。将定义NUM_INPUT
,然后生成verilog,我认为这会增加可伸缩性和重用代码。
新工具可以支持多维端口我发现它与某些工具不可靠,即input [31:0] data [9:0]
。
有一个ruby gem设计用于解析像RubyIt这样的文件;
提到你在NUM-1之前使用了1...NUM
...NUM
均值,你通常会使用0...NUM
来暗示NUM次迭代或1..NUM
从1开始编号
你使用的for循环是一个verilog风格,但是你已经使用了嵌入式ruby作为一些变量。
这样的事情可能会更好:
<% NUM_INPUT = 3 %>
module decoder
(
<% (1..NUM_INPUT).each do |i| -%>
input [2:0] freq_<%=i%>,
<% end -%>
output [2:0] decoded_freq
);
<% (1..NUM_INPUT).each do |i| -%>
wire [2:0] x<%=i%>;
<% end -%>
//decode logic below
assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one
<%# Ruby comment, for loop to create the others %>
<% (2..NUM_INPUT).each do |i| -%>
assign x<%=i%> = (x<%=i-1%> > freq_<%=i%>)? x<%=i-1%>:freq_<%=i%>;
<% end %>
我调用了这个decoder.rv并用
运行它创建了decoder.vgem install ruby_it
ruby_it -f test.rv
生成的文件:
module decoder
(
input [2:0] freq_1,
input [2:0] freq_2,
input [2:0] freq_3,
output [2:0] decoded_freq
);
wire [2:0] x1;
wire [2:0] x2;
wire [2:0] x3;
//decode logic below
assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one
assign x2 = (x1 > freq_2)? x1:freq_2;
assign x3 = (x2 > freq_3)? x2:freq_3;