最近我正在与一个开发ASIC的硬件设计小组合作.我正在绘制大量用于使用Microsoft Excel的时序图,因为它很容易导入到Word文档中.但是,使用Excel越来越困难.
什么可以用来绘制时序图?那里有简单的工具吗?
我们假设我必须在std_logic_vector上测试不同的位.实现一个单独的进程,每个位的for循环或者使用for-generate来实例化'n'进程,每个进程测试一位是不是更好?
FOR-LOOP
my_process: process(clk, reset) begin
if rising_edge (clk) then
if reset = '1' then
--init stuff
else
for_loop: for i in 0 to n loop
test_array_bit(i);
end loop;
end if;
end if;
end process;
Run Code Online (Sandbox Code Playgroud)
FOR-GENERATE
for_generate: for i in 0 to n generate begin
my_process: process(clk, reset) begin
if rising_edge (clk) then
if reset = '1' then
--init stuff
else
test_array_bit(i);
end if;
end if;
end process;
end generate;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对FPGA和ASIC实施会产生什么影响?CAD工具可以轻松应对什么?
编辑:只是添加我给一个帮助人的回复,让我的问题更清楚:
例如,当我在ISE上使用for循环运行一段代码时,综合摘要给了我一个公平的结果,花了很长时间来计算所有内容.当我重新编写我的设计时,这次使用for-generate和几个进程,我使用了更多的区域,但是该工具能够更快地计算所有内容,并且我的计时结果也更好.那么,它是否意味着一个规则,总是更好地使用for-generate,需要额外的面积和更低的复杂性,或者是我必须验证每一个实现可能性的情况之一?
我正在从事需要综合我的 RTL 代码专门用于 ASIC 开发的项目。鉴于这种情况,在设计我的 RTL 时将时序逻辑与差分逻辑分开有多重要?如果这很重要,那么我在设计时应该采用什么方法,好像我应该如何区分顺序逻辑和组合逻辑的设计?
项目“doxverilog”不受更多支持,作者的站点没有响应。项目http://intelligentdv.com/downloads/index.html#doxygentools仅适用于 SV 类层次结构。AMIQ http://www.dvteclipse.com/ Specador 是企业定价过高的产品。用什么?
我有以下数据:
A = [a0 a1 a2 a3 a4 a5 .... a24]
B = [b0 b1 b2 b3 b4 b5 .... b24]
Run Code Online (Sandbox Code Playgroud)
然后,我想要乘以如下:
C = A * B' = [a0b0 a1b1 a2b2 ... a24b24]
Run Code Online (Sandbox Code Playgroud)
这显然涉及25次乘法.
但是,在我的场景中,每个"循环迭代"只有5个新值被移入A(并且5个旧值从A移出).有没有快速的方法来利用数据通过A转移而不是全新的事实?理想情况下,我希望最小化乘法运算的数量(可能需要更多的加法/减法/累加).我最初认为收缩压阵列可能有所帮助,但它没有(我想!?)
更新1:注意B长期固定,但可以重新编程.
更新2:A的移位如下:a [24] <= a [19],a [23] <= a [18] ... a [1] <= new01,a [0] <= new00.依此类推每个时钟周期
非常感谢!
我使用本教程安装了SystemC库2.3.1 .
我写了这个hello world例子:
//hello.cpp
#include <systemc.h>
SC_MODULE (hello_world) {
SC_CTOR (hello_world) {
}
void say_hello() {
cout << ”Hello World systemc-2.3.0.\n”;
}
};
int sc_main(int argc, char* argv[]) {
hello_world hello(“HELLO”);
hello.say_hello();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
并使用此命令编译:
export SYSTEMC_HOME=/usr/local/systemc230/
g++ -I. -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME/lib-linux -Wl,-rpath=$SYSTEMC_HOME/lib-linux -o hello hello.cpp -lsystemc -lm
Run Code Online (Sandbox Code Playgroud)
当我编译代码时,我得到了一个库错误:
In file included from hello.cpp:1:0:
/usr/local/systemc230/include/systemc.h:118:16: error: ‘std::gets’ has not been declared
using std::gets;
^~~~
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
在(常规)软件中,我曾在使用gcc选项-Wall显示所有警告的公司工作.然后他们需要处理.使用Verilog或VHDL中的非平凡FPGA/ASIC设计通常会有许多警告.我应该担心所有这些吗?你有什么特别的技巧可以建议吗?我的流程主要针对FPGA(特别是Altera和Xilinx),但我认为相同的规则适用于ASIC设计,可能更多,因为在构建之后无法更改设计.
2010年4月29日更新:我最初考虑的是综合和P&R(布局布线)警告,但模拟警告也是有效的.
在进行时钟域转换(速率匹配)时,我们通常会翻转数据以避免元稳定状态.双重翻转只会降低元稳定性的可能性.三次翻转将进一步减少它.
如何计算元稳定性和使用的时钟域触发器数之间的概率/关系?
我试图了解芯片中的时钟重置。在设计中,使用什么标准来决定复位期间是否应为触发器分配一个值(通常为零)?
always_ff @(posedge clk or negedge reset) begin : process_w_reset
if(~reset) begin
flop1 <= '0;
....
end else begin
if (condition) begin
flop1 <= something ;
....
end
end
end
always_ff @(posedge clk) begin : process_wo_reset
if (condition) begin
flop1 <= something ;
....
end
end
Run Code Online (Sandbox Code Playgroud)
不重置稍后用作梳状逻辑中的控制信号的触发器是一种不好的做法吗?如果设计确保触发器在用于梳状逻辑块(即在 if 语句或 FSM 梳状逻辑中)之前分配有有效值(0 或 1),该怎么办?
我觉得最好总是重置设计中的所有失败。这样芯片复位后就不会有X了。然而,对于数据路径逻辑来说,重置触发器可能并不是什么大问题,因为它只是管道阶段。然而,如果触发器位于控制路径中(即,FSM 下一状态梳逻辑),则应将其重置为默认值。我的理解正确吗?我对DFT了解不多,不确定它是否还有其他含义。
我遇到了优先级编码器设计,并找到了一种使用case语句的新方法.唯一令人困惑的是,案例陈述是否优先考虑案件?例:
case(1'b1)
A[3]: Y<=4'b1000;
A[2]: Y<=4'b0100;
A[1]: Y<=4'b0010;
A[0]: Y<=4'b0001;
default:Y<=4'b0000;
endcase
Run Code Online (Sandbox Code Playgroud)
在这里,如果我给A
为1111
Y
获得1000
即它优先考虑的第一个case语句.为什么会这样?
我一直读到 RTL 代码中声明的延迟永远无法被综合。它们仅用于模拟目的,现代综合工具只会忽略代码中的延迟声明。
例如:将被综合工具x = #10 y;
视为。x = y;
有人可以解释一下为什么无法综合任何硬件描述语言(即VHDL、Verilog 或Sytem-Verilog)中的延迟声明吗?
如果对于给定的进程,我声明一个变量(假设是一个1位变量variable temp : std_logic;
),那么如果给定的条件返回true,我可以为变量赋值,即
if (xyz=1) then --Assuming that this condition returns TRUE
temp:= '1';
Run Code Online (Sandbox Code Playgroud)
?? 这种逻辑是否可以用于ASIC?
在SystemVerilog仿真中,预分配区域是给定时隙中的几个区域之一。该地区的实际目的是什么?谁能用一个有效的例子来解释这一点?