我们可以为自定义模块提供一组实例吗?
例如:我们可以input [15:0] a;- 这会创建一个总线.我们可以为自定义模块做同样的事情,即DFF [15:0] d;DFF是自定义模块吗?在这里,我打算创建16个DFF模块实例.
SystemVerilog添加了包以提供公共代码段(函数,类型,常量等)的命名空间.但由于软件包未实例化,因此无法对其进行参数化,因此处理参数化成员是有问题的.在实践中,我发现这是非常有限的,因为我的自定义类型通常有一些参数指示字段宽度等.
我通常通过使用带有默认值的参数处理这个问题,并且只是理解我需要返回更改某些应用程序的包源代码,这对我来说似乎非常错误.但我还没有找到一种方法来更清洁地处理这个问题.例如:
package my_pkg;
parameter ADDR_MSB = 7;
parameter DATA_MSB = 31;
typedef struct {
logic [ADDR_MSB:0] address;
logic [DATA_MSB:0] data;
} simple_struct_t;
endpackage
Run Code Online (Sandbox Code Playgroud)
有没有人找到一个更清洁的方式处理这个?我很乐意听到它,因为我认为软件包是SV的一个非常强大的补充,可以实现更安全的代码重用,但这种限制非常严重.
我正在寻找一个快速的方式做81号的部分排序 - 理想的情况下我期待提取最低16个值(它不是必需的16是在绝对正确的顺序).
这样做的目标是在FPGA专用硬件 - 所以这个稍微复杂的问题,因为我想要的结果执行的面积尽可能小.我看了看,并实施了奇偶合并排序算法,但我的理想在寻找什么,可能是我的需求更有效的(贸易算法实现大小的部分排序,以便给予最低16,不一定而不是一个完整的)
任何建议都会非常受欢迎
非常感谢
我想在我的顶级测试平台中创建一个时钟,其周期可以从测试中控制.我所做的是将句点设置为uvm_config_db并将其恢复到测试平台中.我必须输入#1以确保构建阶段已完成,否则get返回错误的值:
module testbench_top;
int clk_period;
bit clk = 0;
initial begin
#1;
void'(uvm_config_db #(int) ::get(null, "uvm_test_top.env", "clk_period", clk_period));
// Create clk
forever begin
#(clk_period/2) clk = !clk;
end
end
Run Code Online (Sandbox Code Playgroud)
我被#1烦恼了.有没有更好的方法来检查配置是否已设置?我可以以某种方式阻止直到start_of_simulation_phase?
SystemVerilog引入了一些非常有用的结构来改进编码风格.然而,正如我的一位同事总是说:"你不是在编写软件,而是在描述硬件." 考虑到这一点,当需要合成最终结果时,应该避免使用哪种语言特性?该论文显示了功能目前由Synopsys的工具合成的,但为了安全起见,我认为应该只使用由所有主要厂商的综合的功能.另外,什么结构会在网表中产生奇怪的结果,这在ECO中很难遵循?
总结:我喜欢紧凑且易于维护的代码,但如果它在后端引起问题则不行.我应该避免什么?
编辑:为了回应关闭投票,我想尝试使其更具体一点.这个问题的灵感来自于这个答案.我很喜欢使用'糖',因为Dave称之为降低代码复杂性,但是如果某些综合工具会破坏信号名称并使结果难以处理,那就不行了.我正在寻找更多这样的例子.
我在我的设计中为时钟控制了一些锁存和逻辑.我在合成和布局方面没有太多经验.在RTL中实现时钟门控的正确方法是什么?
例1:
always_comb begin
gated_clk = clk & latch_update_en;
end
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
Run Code Online (Sandbox Code Playgroud)
例2:在对RTL时钟门控的良好实践进行一些研究时,我偶然发现了一个RTL示例.该示例实现了上面的代码:
clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
Run Code Online (Sandbox Code Playgroud)
使用自定义时钟门控单元的目的是什么?如果clk在带有另一个使能信号的always_comb块中直接"和"处理,那么该工具是否在合成中有困难时间?我感觉使用特殊时钟门控单元是生成门控时钟信号的标准方法.我试图理解为什么会这样.
我正在尝试在FPGA上实现一个微控制器,我需要为它的程序提供一个ROM.如果我使用$ readmemb,那么它会被正确地合成到ROM吗?如果没有,这样做的标准方法是什么?
我在verilog中看到一个声明integer level = log(N)(其中N是一个参数,级别是确定的)但是我知道我不能在verilog中做复杂的数学语句,所以我想知道是否有上述问题的替代解决方案?
任何反馈意见!
我有一个监控公交车的测试台.总线内的一些信号可以是1'bx.由于各种原因,我需要知道总线内的任何信号是否为1'bx.如果总线包含任何x,那么测试的最佳方法是什么(不是用于综合 - 仅用于模拟目的)?我原本希望我可以使用减少或然后使用===,但这似乎不起作用.谢谢,
d
我刚刚开始学习Verilog,我从不同的来源看到了这三行.我对这三者之间的区别感到困惑:
这些线似乎为c赋值,但有什么区别?谢谢.