Verilog放置约束与生成语句

时间:2013-12-09 22:00:58

标签: hardware verilog fpga xilinx hdl

我正在尝试使用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

2 个答案:

答案 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