在Verilog和VHDL中,“logic[19:4]”和“logic[15:0]”之间到底有什么区别?

在Verilog和VHDL中,“logic[19:4]”和“logic[15:0]”之间到底有什么区别?,vhdl,verilog,system-verilog,Vhdl,Verilog,System Verilog,当然,VHDL中的等效语法是什么 较低的索引是索引的最小界限吗?具有不同边界但宽度相同的信号之间的赋值会发生什么情况?假设您的意思是宽度相同 …那么,在Verilog中,我们假设您的意思是 logic [19:4] v19_4; logic [15:0] v15_0; signal v19_4 : std_logic_vector(19 downto 4); signal v15_0 : std_logic_vector(15 downto 0); 在Verilog模拟中,除非尝试索引位,否

当然,VHDL中的等效语法是什么

较低的索引是索引的最小界限吗?具有不同边界但宽度相同的信号之间的赋值会发生什么情况?

假设您的意思是宽度相同

…那么,在Verilog中,我们假设您的意思是

logic [19:4] v19_4;
logic [15:0] v15_0;
signal v19_4 : std_logic_vector(19 downto 4);
signal v15_0 : std_logic_vector(15 downto 0);
在Verilog模拟中,除非尝试索引位,否则不会有任何差异。

如果你索引这些位,你会发现

  • 在第一种情况下,左手位是位19(即
    v19_4[19]
    ),而在第二种情况下,左手位是位15(即
    v15_0[15]

  • 在第一种情况下,右侧位是位4(即
    v19\u 4[4]
    ),而在第二种情况下,右侧位是位0(即
    v15\u 0[0]

在Verilog中,可以将左侧位称为“MSB”,将右侧位称为“LSB”

您将在VHDL中体验完全相同的行为。在VHDL中,假设您的意思是

logic [19:4] v19_4;
logic [15:0] v15_0;
signal v19_4 : std_logic_vector(19 downto 4);
signal v15_0 : std_logic_vector(15 downto 0);
同样,在VHDL模拟中,除非尝试索引位,否则不会有任何差异。如果你索引这些位,你会发现

  • 在第一种情况下,左手位是位19(即
    v19_4(19)
    ),而在第二种情况下,左手位是位15(即
    v15_0(15)

  • 在第一种情况下,右侧位是位4(即
    v19_4(4)
    ),而在第二种情况下,右侧位是位0(即
    v15_0(0)

通过合成,你可能会看到不同通常建议从0索引向量进行合成,以消除合成比需要更多位的可能性。但是,我认为大多数合成器都会优化多余的逻辑。

假设您的意思是宽度相同

…那么,在Verilog中,我们假设您的意思是

logic [19:4] v19_4;
logic [15:0] v15_0;
signal v19_4 : std_logic_vector(19 downto 4);
signal v15_0 : std_logic_vector(15 downto 0);
在Verilog模拟中,除非尝试索引位,否则不会有任何差异。

如果你索引这些位,你会发现

  • 在第一种情况下,左手位是位19(即
    v19_4[19]
    ),而在第二种情况下,左手位是位15(即
    v15_0[15]

  • 在第一种情况下,右侧位是位4(即
    v19\u 4[4]
    ),而在第二种情况下,右侧位是位0(即
    v15\u 0[0]

在Verilog中,可以将左侧位称为“MSB”,将右侧位称为“LSB”

您将在VHDL中体验完全相同的行为。在VHDL中,假设您的意思是

logic [19:4] v19_4;
logic [15:0] v15_0;
signal v19_4 : std_logic_vector(19 downto 4);
signal v15_0 : std_logic_vector(15 downto 0);
同样,在VHDL模拟中,除非尝试索引位,否则不会有任何差异。如果你索引这些位,你会发现

  • 在第一种情况下,左手位是位19(即
    v19_4(19)
    ),而在第二种情况下,左手位是位15(即
    v15_0(15)

  • 在第一种情况下,右侧位是位4(即
    v19_4(4)
    ),而在第二种情况下,右侧位是位0(即
    v15_0(0)


通过合成,你可能会看到不同通常建议从0索引向量进行合成,以消除合成比需要更多位的可能性。但是,我认为大多数合成器都会优化多余的逻辑。

我想你的意思是19:3,否则这两个范围有不同的大小。@谢谢jeff,更正为[15:0]我想你的意思是19:3,否则这两个范围有不同的大小。@jeff谢谢,更正为[15:0]谢谢!因此,如果我声明
bit[39:4]addr\u a
,并想将其与
bit[39:0]addr\u b
[sic]进行比较,那么只写
addr\u a[39:0]==addr\u b[39:0]
是非法的,写
addr\u a==addr\u b
是不正确的(但由于缺乏类型检查而不是非法的)。我写了一篇白皮书,提出了一种在SystemVerilog中更好地进行类型检查的方法,将数据包装在未打包的结构中。看,谢谢!因此,如果我声明
bit[39:4]addr\u a
,并想将其与
bit[39:0]addr\u b
[sic]进行比较,那么只写
addr\u a[39:0]==addr\u b[39:0]
是非法的,写
addr\u a==addr\u b
是不正确的(但由于缺乏类型检查而不是非法的)。我写了一篇白皮书,提出了一种在SystemVerilog中更好地进行类型检查的方法,将数据包装在未打包的结构中。看见