使用verilog设计具有未知输入数量的解码器

时间:2013-10-17 15:11:06

标签: ruby for-loop verilog

这是我的问题。 我有未知数量的输入(均为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循环。它会按我的意愿运作吗?还有其他办法吗?

1 个答案:

答案 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.v
gem 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;