“ Signal is assigned but never used ” 意味着在您的设计中有一个变量接收一个值,也就是说,对该变量的触发器有写访问权限,但它接收到的值从未用于任何其他部分的设计。也就是说,没有对该触发器的读取访问权限。
因此,您必须检查您的tempPS
寄存器是否用作 Verilog 表达式中的 RHS,或者它们的引脚是否输出到您设计的 TLD 端口。
在您的设计中,唯一tempPS
既分配又读取的部分是tempPS[4]
. 该寄存器的其余位永远不会被读取,因此在其中存储一个值是毫无意义的(没有人会读取它们!)。
就像连锁反应一样,如果存储在PS
内存中的值仅传输到tempPS
,而实际使用的唯一部分tempPS
是tempPS[4]
,这意味着实际使用的唯一部分PS
是所有 10 个值的第 4 位,所以期望合成器修剪PS[0]
,PS[1]
以及PS[2]
所有 10 个值PS
。
换句话说:
如果 areg
被读取(用于表达式的右侧,或连接到输出端口,而输出端口又连接到其他地方)但未写入,reg
则将转换为值等于在初始块中被初始化。在电子学上,常数是一个信号,其位与VCC
或GND
实现1
或相关联0
。
如果 areg
是从写入的(用于表达式的左侧,或连接到输入端口,而输入端口又连接到其他地方)但未从中读取,reg
则将对其进行修剪。这个决定背后的逻辑是:“如果没有人关心我的价值是什么,我是否存在并不重要”
修剪发生在级联中:如果您有这样的代码:
reg r0=0,r1=0,r2=0,r3=0;
always @(posedge clk) begin
r1 <= r0;
r2 <= r1;
r3 <= r2;
end
然后:
r0
将被转换为常量,因为它没有被写入,但似乎是从中读取的(第一个非阻塞赋值)
两者r1
和r2
似乎都被读取和写入,所以合成器应该保留它们,但是......
来r3
了:它被写入,但没有人读取它的值,所以合成器修剪它。因此,第三个赋值 ( r3 <= r2
) 被删除,因此r2
不再在表达式的 RHS 中使用(即没有人读取它的值),因此它也被修剪。因此,第二个分配 ( r2 <= r1
) 被删除。再一次,r1
不再从中读取,因此它被修剪,使第一个赋值(r1 <=
r0 )无用,从而导致r0
no 被读取,因此也被修剪。所以我们的always
块不包含代码,所以合成器删除它,留下一个完全空的电路作为结果。