信号已分配但从未使用过。将修剪此未连接的信号

时间:2013-12-30 12:12:44

标签: verilog fpga xilinx spartan

首先 - 我有三维注册,仅在初始开始时分配。

reg [4:0] PS[0:9];

PS[0] = 24; PS[1] = 10; PS[2] = 8; PS[3] = 8; PS[4] = 17;
PS[5] = 16; PS[6] = 4; PS[7] = 4; PS[8] = 16; PS[9] = 16;

起初我试图访问这样的位(pc是我的程序计数器):

if(PS[pc][4] == 0) Z1 <= 0;
else Z1 <= 1;

但优化一直在削减我的信号。后来我发现我需要新的reg来保持整个reg,然后我可以访问位。所以我做到了:

reg [4:0] tempPS;

[...]

tempPS = PS[pc];
Z1 <= tempPS[4];

我的信号停止被修剪,但现在优化想要修剪tempPS,因为:

已分配信号但从未使用过。在优化过程中将修剪此未连接的信号。

好吧 - 随着pc的变化,使用了tempPS,我不知道这个错误究竟意味着什么,我该如何修复它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

信号已分配,但从未使用”意味着在您的设计中有一个变量接收一个值,即对该变量的触发器有写访问权限,但是它接收的价值从未用于设计的任何其他部分。也就是说,没有对该触发器的读访问权。

因此,您必须检查tempPS寄存器是否用作Verilog表达式中的RHS,或者它们的引脚是否输出到您设计的TLD端口。

在您的设计中,tempPS分配和阅读的唯一部分是tempPS[4]。该寄存器的其余部分永远不会被读取,因此在它们中存储一个值是无用的(没有人会读取它们!)。

就像连锁反应一样,如果存储在PS内存中的值仅转移到tempPS,并且实际使用的tempPS的唯一部分是tempPS[4],这意味着实际使用的PS的唯一部分是所有10个值中的第4位,因此期望合成器修剪所有值的PS[0]PS[1]PS[2] 10个值PS


换句话说:

  • 如果读取reg(在表达式的右侧使用,或连接到输出端口,而输出端口又连接到其他地方)但未写入reg,则VCC 1}}将被转换为一个常量,其值等于初始化块中初始化的值。在电子方面,常数是一个信号,其位与GND1相关联,以实现0reg

  • 如果写入reg(在表达式的左侧使用,或连接到输入端口,而输入端口又连接到其他位置)但未读取reg r0=0,r1=0,r2=0,r3=0; always @(posedge clk) begin r1 <= r0; r2 <= r1; r3 <= r2; end ,则r0 1}}将被修剪。这种决定背后的逻辑是:“如果没有人关心我的价值是什么,如果我存在与否则无关紧要”

剪辑发生在级联中:如果你有这样的代码:

r1

然后:

  • r2将被转换为常量,因为它不会被写入,但它似乎是从(第一次非阻塞赋值)中读取的

  • 似乎都会读取和写入r3r3 <= r2,因此合成器应该保留它们,但是......

  • 这里有r2:它被写入,但是没有人读取它的值,因此合成器会使它变得更好。因此,第三个赋值(r2 <= r1)被删除,因此r1不再用于表达式的RHS(即没有人读取它的值),因此它也被修剪。因此,第二个分配(r1 <=)将被删除。再一次,r0不再被读取,因此它被修剪,使得第一个赋值(always r0)无效,从而导致{{1}}为无读取,因此被修剪太。因此我们的{{1}}块不包含任何代码,因此合成器会将其删除,从而留下完全空的电路。