首先 - 我有三维注册,仅在初始开始时分配。
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,我不知道这个错误究竟意味着什么,我该如何修复它。任何帮助表示赞赏。
答案 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}}将被转换为一个常量,其值等于初始化块中初始化的值。在电子方面,常数是一个信号,其位与GND
或1
相关联,以实现0
或reg
。
如果写入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
将被转换为常量,因为它不会被写入,但它似乎是从(第一次非阻塞赋值)中读取的
似乎都会读取和写入r3
和r3 <= r2
,因此合成器应该保留它们,但是......
这里有r2
:它被写入,但是没有人读取它的值,因此合成器会使它变得更好。因此,第三个赋值(r2 <= r1
)被删除,因此r1
不再用于表达式的RHS(即没有人读取它的值),因此它也被修剪。因此,第二个分配(r1 <=
)将被删除。再一次,r0
不再被读取,因此它被修剪,使得第一个赋值(always
r0)无效,从而导致{{1}}为无读取,因此被修剪太。因此我们的{{1}}块不包含任何代码,因此合成器会将其删除,从而留下完全空的电路。