我正在尝试使用Generate语句生成一个彼此相邻放置的锁存器数组。我一直在尝试使用Xilinx约束“RLOC”来做到这一点,但我还没有成功。
下面的代码不会成功实现,但应该说明我想要获得的代码。下面的代码的问题是约束调用中的“i”没有被转换为字符串,这是调用所寻找的。有没有人有这方面的经验?
我正在使用Virtex4和Xilinx ISE 10.1.03进行综合和实现。我不完全确定我使用的是什么版本的Verilog,但我认为它是Verilog 2001.如果有人也能告诉我如何查看我正在使用的Verilog版本,我将不胜感激。
genvar i;
generate
for (i = 0; i < DATA_WIDTH; i = i + 1)
begin : LATCH
(* RLOC = {"X0Y", i} *)
latch inst_latch (
.d (data_in[i]),
.gate (gate),
.reset (reset),
.q (data_out[i])
);
end
endgenerate
答案 0 :(得分:1)
我猜测Xilinx正在将{"X0Y", i}
视为文字,而不是评估它。您可以使用脚本为您处理生成。您可以使用首选编程生成的代码,然后在verilog文件中使用`include语句。或者你可以使用嵌入式路线:
概念是相同的,只是用于转换的嵌入式语言和工具的差异。
缺点是脚本不会将DATA_WIDTH
视为变量/参数。你必须将脚本传递给一个数值常量,或者找一些传递值的奇特方法。
答案 1 :(得分:0)
我最终使用参数化宏在传递给RLOC时用字符串替换generate变量。这是一个很好的解决方法,如果我之前看到它,我很可能会使用Greg的解决方案。
无论如何,如果人们真正感兴趣,那么宏:
parameter DIGITS = "9876543210";
`define THOUSANDS(x) (x / 1000)
`define HUNDREDS(x) ((x - (`THOUSANDS(x) * 1000)) / 100)
`define TENS(x) ((x - (`THOUSANDS(x) * 1000) - (`HUNDREDS(x) * 100)) / 10)
`define ONES(x) (x - (`THOUSANDS(x) * 1000) - (`HUNDREDS(x) * 100) - (`TENS(x) * 10))
`define TO_STRING(x) (DIGITS[((8 * (x + 1)) - 1) : (8 * x)])
`define VAR_TO_STRING(x) ({`TO_STRING(`THOUSANDS(x)), `TO_STRING(`HUNDREDS(x)), `TO_STRING(`TENS(x)), `TO_STRING(`ONES(x))})
宏THOUSANDS(),HUNDREDS(),TENS()和ONES()返回 x 中的数千,数百,数十和1的数量。这些宏应始终返回1位数值。
TO_STRING()需要1位数值,并通过返回参数 DIGITS 的一部分将其“转换”为字符串。
VAR_TO_STRING()将所有上述宏结合使用,将任意4位整数转换为等效的字符串。然后,问题中的代码将替换为:
genvar i;
generate
for (i = 0; i < DATA_WIDTH; i = i + 1)
begin : LATCH
(* RLOC = {"X0Y", `VAR_TO_STRING(i)} *)
latch inst_latch (
.d (data_in[i]),
.gate (gate),
.reset (reset),
.q (data_out[i])
);
end
endgenerate