我正在尝试在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; )
如果主站和从站的数量是参数,有没有办法生成上面的赋值语句?或者还有其他方法可以完成我想要做的事情吗?任何帮助将不胜感激。
答案 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