在VHDL,Verilog,sim行为中将无效地址写入RAM

时间:2017-07-08 22:54:40

标签: vhdl verilog simulation xilinx intel-fpga

让我们在Verilog或VHDL下拥有BRAM或任何其他内存。 例如:

module raminfr (clk, we, a, di, do);   

input clk;   
input we;   
input  [4:0] a;   
input  [3:0] di;   
output [3:0] do;   
reg    [3:0] ram [31:0]; 

  always @(posedge clk) begin   
    if (we)   
      ram[a] <= di;   
  end   
  assign do = ram[a];   
endmodule

现在假设我们已经将有效数据写入“ram”。

如果地址“a”将具有无效值(4'bxxxx)(“我们”= 1且clk将具有posedge),模拟器是否会对“ram”中的所有项目进行invavalidate? 或者它让ram中的值保持原样?

2 个答案:

答案 0 :(得分:1)

For Verilog

IEEE Std 1800-2009 SystemVerilog标准包含IEEE Std 1364-2005 Verilog标准和IEEE Std 1800-2005 SystemVerilog标准。 IEEE Std 1800-2012 SystemVerilog标准取代了-2009版本。

参见IEEE Std 1800-2012 7.4.6数组的索引和切片:

  

如果索引表达式超出范围或索引表达式中的任何位是 x z ,则索引应无效。从具有无效索引的任何类型的解压缩数组中读取应返回表7-1中指定的值。 写入具有无效索引的数组不应执行任何操作,但写入队列的元素[$ + 1](在7.10.1中描述)和创建关联的新元素除外数组(在7.8.6中描述)。 如果对阵列上的读取或写入操作发生无效索引,则实现可能会发出警告。

对于VHDL

等效的VHDL设计描述可能是:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity raminfr is
    port (
        clk:  in  std_logic;
        we:   in  std_logic;
        a:    in  std_logic_vector(4 downto 0);
        di:   in  std_logic_vector(3 downto 0);
        do:   out std_logic_vector(3 downto 0)
    );
end entity;

architecture behave of raminfr is
    type ram_type is array (0 to 15) of std_logic_vector (3 downto 0);
    signal ram:  ram_type;
begin
    process (clk)
    begin
        if rising_edge(clk) then
            if we = '1' then
                ram(to_integer(unsigned(a))) <= di;
            end if;
        end if;
end process;
    do <= ram(to_integer(unsigned(a)));
end architecture;

使用numeric_stdto_integer函数将a的数组值转换为整数索引。 (VHDL在这里更灵活,数组索引可以是整数类型或枚举类型,一起称为离散类型)。

读取to_integer的源代码,我们看到它会将包含'X'的输入无符号数组值转换为所有'X',并且'为'X'的'LEFT值'将返回一个自然整数子类型值0并可选择报告:

if (XARG(XARG'left) = 'X') then
      assert NO_WARNING
        report "NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0"
        severity warning;
      return 0;
    end if;

通过更改本地静态的NO_WARNING值,可以在实现范围内禁用这些警告。使用to_integer(或使用Synopsys包std_logic_arith和函数conv_integer)索引将为0。

此外,VHDL实现还能够停止对严重性警告报告进行模拟。

虽然您可以使用以不同方式提供的索引来处理赋值的结果(如在2,4,8,16或32个无效的内存位置中,取决于{{''元素值的数量{{ 1}}},你已经破坏了设计模型状态的完整性,并且在计算SystemVerilog或VHDL设计模型的模拟结果之前应该采取一些纠正措施。

复杂摆弄的开销一般看起来不值得。这些警告是一类警告,应在综合之前进行审查。

当数组值的默认初始值为元值时,可以在重置数组值之前发生这些警告。您可以通过初始化a和任何前任来阻止这种情况,因此a包含表示值的二进制值,或者只是在复位生效之前忽略报告时的报告。

您还可以通过将a和任何前置任务初始化为“0”来阻止写入地址0。

答案 1 :(得分:0)

模拟器不会使任何东西无效。相反,写入将被忽略。

对于在这种情况下的阅读,它将返回&#39; x&#39;虽然。