我是Verilog的新手并且还在学习它,但我首先想到的是这种语言是关于端口互连的全部内容。所以,我天真地写了下面的代码
module mult4(input wire [3:0] x, y,
output wire [7:0] z)
sum8 sh, sl, ss;
assign sl.x = (y[0] ? x : 0),
sl.y = (y[1] ? x : 0) << 1,
sh.x = (y[2] ? x : 0) << 2,
sh.x = (y[3] ? x : 0) << 3,
ss.x = sl.z,
ss.y = sh.z,
sl.cin = 0,
sh.cin = 0,
ss.cin = 0,
z = ss.z;
endmodule
它根本不起作用。这里sum8
只是一个8位加法器,具有以下签名:
module sum8(input wire cin, // carry-in bit
input wire [7:0] x, y, // operands
output wire cout, // carry-out bit
output wire [7:0] z); // result
当然,我可以重写这段代码以使其编译,但我想知道另一件事。有没有办法在Verilog中实现类似的外观,或者我可以在模块名称后面的括号内定义端口映射的唯一位置?如果是这样,有原因吗?其他HDL是否具有我想要的功能?
答案 0 :(得分:2)
最接近的是SystemVerilog中的interface
构造。它看起来像这样:
interface adder8_itf;
wire cin; // carry-in bit
wire [7:0] x, y; // operands
wire cout; // carry-out bit
wire [7:0] z; // result
endinterface
module mult4(input wire [3:0] x, y,
output wire [7:0] z);
adder8_itf sh(), sl(), ss();
sum8 i1(sh), i2(sl), i3(ss);
assign sl.x = (y[0] ? x : 0),
sl.y = (y[1] ? x : 0) << 1,
sh.x = (y[2] ? x : 0) << 2,
sh.x = (y[3] ? x : 0) << 3,
ss.x = sl.z,
ss.y = sh.z,
sl.cin = 0,
sh.cin = 0,
ss.cin = 0,
z = ss.z;
endmodule
module sum8 (adder8_itf itf);
assign {itf.cout,itf.z} = itf.x +itf.y;
endmodule
尽管如此,这可能是更多的工作,因此您可以以不同的方式组织端口分配。
答案 1 :(得分:1)
据我所知,只有两种方法可以按名称或顺序连接Verilog中的端口。您可以查看this article,了解解决方法。
但是,您可以使用the port map
directive.