【问题标题】:using a conditional variable which is defined later in verilog使用稍后在 verilog 中定义的条件变量
【发布时间】:2017-01-01 21:47:35
【问题描述】:
假设我有以下实例化
first_mux_input=top.middle.down[i];
second_mux_input=top.middle.down[i+1];
assign down = (select[i])? first_mux_input:second_mux_input;
假设有很多多路复用器,它们的输出进入位于它们下方的多路复用器的输入。
我在定义变量“down”之前使用它。这是否合法,因为 verilog 随后编译所有行而不是按顺序(在这种情况下)?
谢谢
【问题讨论】:
标签:
conditional
verilog
instantiation
mux
【解决方案1】:
assign 语句不是声明。声明将是:
wire down;
如果您从未像这样声明 down,它将被隐式声明。
IEEE 1800-2012 第 6.10 节规定:
如果标识符出现在连续赋值语句的左侧,并且该标识符
之前没有在连续赋值语句出现的范围内声明或
在其声明可以从连续的范围中直接引用的任何范围内
赋值语句出现(见 23.9),则默认网络类型的隐式标量网络应为
假定。有关连续赋值语句的讨论,请参见 10.3。
然后:
有关使用 `default_nettype 隐式声明的网络的类型控制的讨论,请参见 22.8
编译器指令。
这(我相信)通常意味着 Verilog 中的 wire 和 SystemVerilog 中的 逻辑。
现在,就使用在赋值之前的值而言,这是完全合法的。只要在使用或赋值后未声明即可。
【解决方案2】:
这取决于您的合成器。我只与赛灵思合作过。在我的例子中,赛灵思接受这种类型定义进行仿真。但是对于综合,您需要在实例化之前定义一个线/寄存器。