System verilog 为什么这句话会引入记忆?

System verilog 为什么这句话会引入记忆?,system-verilog,System Verilog,我正在学习SystemVerilog,今天我的讲师警告我们不要意外地将内存引入组合系统。他使用以下代码作为示例: module gate(output logic y, input logic a); always_comb if(a) y = '1; endmodule 然而,我不明白为什么这会带来问题。据我所知,这只是一个简单的缓冲区。此代码以何种方式将内存引入系统?在模拟开始时,如果a==0则y的值将为'0。如果以后a==1'b

我正在学习SystemVerilog,今天我的讲师警告我们不要意外地将内存引入组合系统。他使用以下代码作为示例:

module gate(output logic y, input logic a);
       always_comb
          if(a)
             y = '1;
endmodule

然而,我不明白为什么这会带来问题。据我所知,这只是一个简单的缓冲区。此代码以何种方式将内存引入系统?

在模拟开始时,如果
a==0
y
的值将为
'0
。如果以后
a==1'b1
,则
y
将变为
'1
。当以后
a==0
时,您希望
y
具有什么值


这个问题的答案是它将保留以前的值:
'1
。这不是组合逻辑的行为,根据定义,组合逻辑的输出只取决于输入的当前状态,而不取决于它们以前的状态。为了实现您描述的行为,合成器需要一个具有状态、存储器和内存的组件。它将通过使用闩锁来实现这一点。

在模拟开始时,如果
a==0
y
的值将为
'0
。如果以后
a==1'b1
,则
y
将变为
'1
。当以后
a==0
时,您希望
y
具有什么值


这个问题的答案是它将保留以前的值:
'1
。这不是组合逻辑的行为,根据定义,组合逻辑的输出只取决于输入的当前状态,而不取决于它们以前的状态。为了实现您描述的行为,合成器需要一个具有状态、存储器和内存的组件。它将通过使用闩锁来实现这一点。

那么,是否可以通过添加
else y='0不要期望在添加
else
分支后合成缓冲区。是否需要缓冲取决于电气和时序约束,而不是布尔行为。我怀疑您的
始终
块将被优化为零。那么,是否可以通过添加
else y='0不要期望在添加
else
分支后合成缓冲区。是否需要缓冲取决于电气和时序约束,而不是布尔行为。我怀疑您的
始终
块将被优化为零。