1

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

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 [4:0] tempPS;

[...]

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

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

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

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

4

1 回答 1

0

Signal is assigned but never used ” 意味着在您的设计中有一个变量接收一个值,也就是说,对该变量的触发器有写访问权限,但它接收到的值从未用于任何其他部分的设计。也就是说,没有对该触发器的读取访问权限。

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

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

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


换句话说:

  • 如果 areg被读取(用于表达式的右侧,或连接到输出端口,而输出端口又连接到其他地方)但未写入,reg则将转换为值等于在初始块中被初始化。在电子学上,常数是一个信号,其位与VCCGND实现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将被转换为常量,因为它没有被写入,但似乎是从中读取的(第一个非阻塞赋值)

  • 两者r1r2似乎都被读取和写入,所以合成器应该保留它们,但是......

  • r3了:它被写入,但没有人读取它的值,所以合成器修剪它。因此,第三个赋值 ( r3 <= r2) 被删除,因此r2不再在表达式的 RHS 中使用(即没有人读取它的值),因此它也被修剪。因此,第二个分配 ( r2 <= r1) 被删除。再一次,r1不再从中读取,因此它被修剪,使第一个赋值(r1 <=r0 )无用,从而导致r0no 被读取,因此也被修剪。所以我们的always块不包含代码,所以合成器删除它,留下一个完全空的电路作为结果。

于 2013-12-30T20:05:44.320 回答