返回介绍

5.7 信号别名

发布于 2020-09-09 22:55:46 字数 2114 浏览 987 评论 0 收藏 0

Verilog assign语句是单向赋值并可以结合一个延时和强度变化。为了建模一个双向短路连接,很有必要使用alias语句。一个别名列表的成员是那些共享相同物理网络的信号。下面的例子实现了总线A和总线B之间的字节顺序交换。

module byte_swap (inout wire [31:0] A, inout wire [31:0] B);
    alias {A[7:0],AA[15:8],AA[23:16],AA[31:24]} = B;
endmodule

下面的例子从一个四字节总线中剥离最低和最高有效字节:

module byte_rip (inout wire [31:0] W, inout wire [7:0] LSB, MSB);
    alias W[7:0] = LSB;
    alias W[31:24] = MSB;
endmodule

位覆盖规则与具有相同成员类型的压缩联合体的位覆盖规则相同:每一个成员应具有相同的尺寸,并且连通性独立于仿真主机。使用别名语句连接的线网必须是类型兼容的。换句话说,它们必须是相同的线网类型。例如,使用alias语句将一个wand线网连接到wor线网是非法的。这比应用到在端口上结合的线网具有更严格的规则,因为别名的作用范围是受限的并且这样的连接很可能是一个设计错误。变量和层次化引用不能使用在别名语句中。如果违背这些规则,那么会认为是一个严重错误。

相同的线网可以出现在多条别名语句中。效果是累积的。下面两个例子是等价的。在这两种情况下,low12[11:4]high12[7:0]共享相同的线网。

module overlap(inout wire [15:0] bus16, inout wire [11:0] low12, high12);
    alias bus16[11:0] = low12;
    alias bus16[15:4] = high12;
endmodule

module overlap(inout wire [15:0] bus16, inout wire [11:0] low12, high12);
    alias bus16 = {high12, low12[3:0]};
    alias high12[7:0] = low12[11:4];
endmodule

为了在规范中避免错误,SystemVerilog不允许从一个单独的变量中为它本身指定别名,也不允许多次指定一个特定的别名。上面代码的下面版本是非法的,因为高四位与低四位在两条语句中是相同的:

alias bus16 = {high12[11:8], low12};
alias bus16 = {high12, low12[3:0]};

下面的语句也是非法的,因为bus16的各位是它本身的别名:

alias bus16 = {high12, bus16[3:0]} = {bus16[15:12], low12};

在模块实例语句可以出现的任何地方都可以出现别名语句。如果在别名语句中出现了没有声明数据类型的标识符,那么就隐含成线网,并与模块实例的隐式线网遵从相同的规则。对于来自不同库的单元,下面的例子使用alias并伴随着自动的名字绑定来连接单元管脚,这样就产生一个标准宏:

module lib1_dff(Reset, Clk, Data, Q, Q_Bar);
    ...
endmodule

module lib2_dff(reset, clock, data, a, qbar);
    ...
endmodule

module lib3_dff(RST, CLK, D, Q, Q_);
    ...
endmodule

macromodule my_dff(rst, clk, d, q, q_bar); // 包装单元
    input rst, clk, d;
    output q, q_bar;
    alias rst = Reset = reset = RST;
    alias clk = Clk = clock = CLK;
    alias d = data = D;
    alias q = Q;
    alias Q_ = q_bar = Q_Bar = qbar;

    ‘LIB_DFF my_dff (.*); // LIB_DFF可以是lib1_dff、lib2_dff或lib3_dff中的任意一个

endmodule

在一条别名语句中使用线网不会修改线网在其它语句中的语法行为。别名在确立的时候执行并且不能取消。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文