我正在尝试在DesignWorks 5中用VHDL实现高速缓存16 * 37.代码如下。 代码运行但是当我从IO面板更改值或甚至模拟时,时序图都没有显示任何内容,基本上代码由于某种原因没有运行。任何建议都会非常有用。
代码:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity Cache is
port(cs, r, clr : in std_logic;
data : in std_logic_vector(31 downto 0);
addr : in std_logic_vector(7 downto 0);
cline : out std_logic_vector(31 downto 0);
ctag: out std_logic_vector(3 downto 0);
v : out std_logic);
end Cache;
architecture behav of Cache is
type RAM is array (0 to 15) of std_logic_vector(36 downto 0);
begin
process is
variable M : RAM;
variable locn : natural;
variable temp_val : std_logic_vector(36 downto 0);
variable cline_val : std_logic_vector(31 downto 0);
variable ctag_val : std_logic_vector(3 downto 0);
variable v_val : std_logic;
begin
if cs = '1' then
locn := to_integer(addr);
if r = '1' then
temp_val := M(locn);
cline_val := temp_val(31 downto 0);
ctag_val := temp_val(35 downto 32);
v_val := temp_val(36);
else
temp_val(31 downto 0) := data;
temp_val(35 downto 32) := addr(3 downto 0);
temp_val(36) := '1';
M(locn) := temp_val;
v_val := 'Z';
ctag_val:= "ZZZZ";
cline_val:= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
end if;
end if;
if clr ='1' then
locn := 0;
while(locn<16) loop
M(locn) := X"000000000" + "0";
locn:=locn+1;
end loop;
end if;
cline <= cline_val;
ctag <= ctag_val;
v <= v_val;
wait on cs;
end process;
end behav;
答案 0 :(得分:0)
这一行:
M(locn) := X"000000000" + "0";
似乎不正确。
M是你的ram数组类型,元素长度为37. 36位零添加到零仍然是36位(它看起来不像你达到这个语句,它将是一个运行时错误)。
制作长度为37的&#39; 0&#39;值使用`(其他=&gt;&#39; 0&#39;)。
你也可以使用for循环for ram clear,你不需要使用16的索引,它超出范围,这告诉我们你也没有达到清晰。
我认为你应该向我们展示你的刺激,否则你的问题就无法再现。
您遗失的data
和addr
作为敏感元素(ya,你的情况是cs环绕,但你想在这里建立一个硬件模型)。
切换到敏感度列表(cs, data, addr)
。
locn
是一个无约束的自然,应该具有与数组类型ram(0到15)匹配的范围。注意你的while循环达到16.真的,使用for循环(如下所示)。约束locn
的原因是为了防止在访问ram(locn)
时出现绑定错误。
请注意将addr
转换为自然(locn
)并使用长度为4的&#39; 1来掩饰addr
以防止范围正常的RAM操作错误。
包numeric_std是一种做法,比在分析和详细说明期间将几个命令行选项传递给ghdl(ieee=synopsys -fexplict
)更容易。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity cache is
port (
cs, r, clr: in std_logic;
data: in std_logic_vector(31 downto 0);
addr: in std_logic_vector(7 downto 0);
cline: out std_logic_vector(31 downto 0);
ctag: out std_logic_vector(3 downto 0);
v: out std_logic
);
end entity;
architecture behav of cache is
type ram is array (0 to 15) of std_logic_vector(36 downto 0);
begin
process (cs, data, addr)
variable m : ram;
variable locn : natural range (ram'range);
variable temp_val : std_logic_vector(36 downto 0);
variable cline_val : std_logic_vector(31 downto 0);
variable ctag_val : std_logic_vector(3 downto 0);
variable v_val : std_logic;
begin
if cs = '1' then
locn := to_integer(unsigned(addr and x"0F"));
if r = '1' then
temp_val := m(locn);
cline_val := temp_val(31 downto 0);
ctag_val := temp_val(35 downto 32);
v_val := temp_val(36);
else
temp_val(31 downto 0) := data;
temp_val(35 downto 32) := addr(3 downto 0);
temp_val(36) := '1';
m(locn) := temp_val;
v_val := 'Z';
ctag_val:= "ZZZZ";
cline_val:= (others => 'Z');
end if;
end if;
if clr ='1' then
for i in ram'range loop
m(i) := (others => '0');
end loop;
end if;
cline <= cline_val;
ctag <= ctag_val;
v <= v_val;
end process;
end architecture;
这段代码分析和阐述,你可能会在我没有提到的地方出现错误,绑定(范围)错误会在运行时出现在赋值中(表达式无关紧要)。
最后一点:
temp_val(31 downto 0) := data;
temp_val(35 downto 32) := addr(3 downto 0);
temp_val(36) := '1';
可以表达:
temp_val:= '1' & addr(3 downto 0) & data;
以及:
locn := to_integer(addr);
表示为:
locn := to_integer(addr(3 downto 0));
如果您使用泛型设置ram大小,也可以从ram'range
创建一个具有算法定义长度的AND掩码。
如果没有看到您的刺激,有几个地方可能会导致运行时错误。检查你的控制台输出。