在Verilog中生成条件赋值语句

时间:2014-11-07 10:31:04

标签: verilog system-verilog

我正在尝试在N个主设备和M个从设备之间创建一个简单的横杆式连接。

如果我有2个Masters和2个Slave,则交叉开关按如下方式连接它们:

// Master - to - Slave  
assign s[0].addr = (gnt[0] == 1) ? m[0].addr : ( (gnt[1] == 1) ? m[1].addr : 'b0; )
assign s[0].data = (gnt[0] == 1) ? m[0].data : ( (gnt[1] == 1) ? m[1].data : 'b0; )

// Slave - to - Master  
assign m[0].resp = (sel[0] == 1) ? s[0].resp : ( (sel[1] == 1) ? s[1].resp : 'b0; )

如果主站和从站的数量是参数,有没有办法生成上面的赋值语句?或者还有其他方法可以完成我想要做的事情吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用generate块:

typedef struct {
  integer addr;
  integer data;
  integer resp;
} sigs;

module crossbar;
  parameter int num_masters = 3;
  parameter int num_slaves = 3;

  sigs s[num_slaves];
  sigs m[num_masters];
  bit gnt[num_masters];


  genvar i, j;

  // master to slave loop
  for (i = 0; i < num_slaves; i++) begin
    wire[31:0] addr;
    for (j = 0; j < num_masters; j++) begin
      assign addr = gnt[j] == 1'b1 ? m[j].addr : 'z;
    end
    assign addr = gnt == '0 ? '0 : 'z;
    assign s[i].addr = addr;
  end
endmodule

我在这里说明的只是addr的分配。你必须有data和任何其他主从信号到这个循环并创建另一个循环,你首先在主服务器上循环,然后从服务器分配resp和任何其他从服务器到主信号

我已经使用addr的中间线来为每个主人设置一个assign语句。这样,当授予主设备时,它将驱动电线,否则它将驱动高阻抗。因此,不要同时授予两个或更多主人是至关重要的。

它并不完全是您所拥有的,但如果您想同时允许多个母版,则可以使用优先级编码方案替换多个分配。

答案 1 :(得分:1)

混合逻辑可以在组合块内缩放。以下示例默认分配为零,然后使用LSB优先级更新分配。

parameter NUM_MASTERS=5, NUM_SLAVES=3;
/* 
 * ...
 */

for ( genvar s_idx = 0; s_idx < NUM_SLAVES; s_idx++ ) begin
  alwasy_comb begin
    // default value
    s[s_idx].addr = '0;
    s[s_idx].data = '0;
    // update with lsb priority
    for ( int idx = NUM_MASTERS-1; idx >= 0; idx-- ) begin
      if (gnt[idx]) begin
        s[s_idx].addr = m[idx].addr;
        s[s_idx].data = m[idx].data;
      end
    end
  end
end

for ( genvar m_idx = 0; m_idx < NUM_MASTERS; m_idx++ ) begin
  alwasy_comb begin
    // default value
    m[m_idx].resp = '0;
    // update with lsb priority
    for ( int idx = NUM_SLAVES-1; idx >= 0; idx-- ) begin
      if (sel[idx]) begin
        m[m_idx].resp = s[idx].resp;
      end
    end
  end
end