在Verilog和VHDL中,“logic[19:4]”和“logic[15:0]”之间到底有什么区别?
当然,VHDL中的等效语法是什么 较低的索引是索引的最小界限吗?具有不同边界但宽度相同的信号之间的赋值会发生什么情况?假设您的意思是宽度相同 …那么,在Verilog中,我们假设您的意思是在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模拟中,除非尝试索引位,否
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(即
),而在第二种情况下,左手位是位15(即v19_4[19]
)v15_0[15]
- 在第一种情况下,右侧位是位4(即
),而在第二种情况下,右侧位是位0(即v19\u 4[4]
)v15\u 0[0]
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(即
),而在第二种情况下,左手位是位15(即v19_4(19)
)v15_0(15)
- 在第一种情况下,右侧位是位4(即
),而在第二种情况下,右侧位是位0(即v19_4(4)
)v15_0(0)
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(即
),而在第二种情况下,左手位是位15(即v19_4[19]
)v15_0[15]
- 在第一种情况下,右侧位是位4(即
),而在第二种情况下,右侧位是位0(即v19\u 4[4]
)v15\u 0[0]
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(即
),而在第二种情况下,左手位是位15(即v19_4(19)
)v15_0(15)
- 在第一种情况下,右侧位是位4(即
),而在第二种情况下,右侧位是位0(即v19_4(4)
)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中更好地进行类型检查的方法,将数据包装在未打包的结构中。看见