0

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

4

1 回答 1

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;
于 2013-10-17T21:08:00.717 回答