【问题标题】:Signal is assigned but never used. This unconnected signal will be trimmed信号已分配但从未使用过。这个未连接的信号将被修剪
【发布时间】:2013-12-30 12:12:44
【问题描述】:

首先 - 我有三维 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,我不知道这个错误究竟意味着什么,我该如何解决它。任何帮助表示赞赏。

【问题讨论】:

  • 你确定它是3维的吗? reg [4:0] PS[0:9]; PS 是 5 位宽和 10 个位置深。不确定您的寻址方式是否正确,但 PS[pc][4] 正在访问一位,这是您想要的吗?
  • 您说:“嗯 - 随着 pc 的变化,使用 tempPS”。将值写入 tempPS 不是“使用”该变量。为防止此信号被修剪,必须在模块中的其他位置对其进行写入和读取。

标签: verilog fpga xilinx spartan


【解决方案1】:

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

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

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

并且像连锁反应一样,如果存储在PS内存中的值只传输到tempPS,而tempPS中唯一实际使用的部分是tempPS[4],那就意味着@的唯一部分实际使用的 987654328@ 是所有 10 个值中的第 4 位,因此希望合成器也修剪 PS 的所有 10 个值中的 PS[0]PS[1]PS[2]


换句话说:

  • 如果从 reg 读取(用于表达式的右侧,或连接到输出端口,该输出端口又连接到其他地方)但未写入,则 reg 将转换为一个常量,其值等于在初始块中初始化的值。在电子方面,常数是一个信号,其位与VCCGND 绑定以实现10

  • 1234563被修剪。这个决定背后的逻辑是:“如果没有人关心我的价值是什么,我是否存在并不重要”

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

reg r0=0,r1=0,r2=0,r3=0;
always @(posedge clk) begin
  r1 <= r0;
  r2 <= r1;
  r3 <= r2;
end

然后:

  • r0会被转换成常量,因为没有写入,但是好像是从(第一次非阻塞赋值)读取的

  • r1r2 似乎都可以读取和写入,因此合成器应该保留它们,但是...

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

【讨论】:

  • 我只粘贴了部分代码:tempPS = PS[pc]; Z1 = tempPS[4]; Z2 = tempPS[3]; Z3 = tempPS[2]; t1 = tempPS[1]; t2 = tempPS[0];它仅用作帮助器 - 所以我可以从 5 位 PS 中读取位。使用了所有 5 位,并且使用了所有 10 种状态;/ 在模拟中,它按应有的方式工作。但是在合成过程中,这个信号被修剪了,一切都变糟了......
  • 你用 Z1、Z2、Z3 等做什么?如果它们没有在您的设计中的任何地方使用,它们将被修剪,因此,来自 tempPS 的所有位。
  • Z1、Z2、Z3 是我的输出——就目前而言,在测试期间它们对 LED 有限制。 t1 和 t2 是我的计时器的设置器,例如: if(t1) begin time1 = 360; rst = 1;结束
  • 然后贴出完整的代码,或者一个完整的例子,这样我们就可以看到寄存器的使用时间和使用方式
  • 无法编译。它说计时器没有定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2012-11-15
  • 2015-03-14
相关资源
最近更新 更多