使用'分配'用于绑定模块端口

时间:2016-10-11 10:56:14

标签: verilog hdl

我是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是否具有我想要的功能?

2 个答案:

答案 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.

找到类似于您在VHDL中描述的内容