我想在我的顶级测试平台中创建一个时钟,其周期可以从测试中控制.我所做的是将句点设置为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称之为降低代码复杂性,但是如果某些综合工具会破坏信号名称并使结果难以处理,那就不行了.我正在寻找更多这样的例子.
良好的编码约定表明我们应该在组合块中使用阻塞分配,在顺序块中使用非阻塞分配.我想++在组合块中使用运算符,但我不知道它是否阻塞.这段代码也是如此:
input [3:0] some_bus;
logic [2:0] count_ones;
always_comb begin
count_ones = '0;
for(int i=0; i<4; i++) begin
if(some_bus[i])
count_ones++;
end
end
Run Code Online (Sandbox Code Playgroud)
相当于:
input [3:0] some_bus;
logic [2:0] count_ones;
always_comb begin
count_ones = '0;
for(int i=0; i<4; i++) begin
if(some_bus[i])
count_ones = count_ones + 1;
end
end
Run Code Online (Sandbox Code Playgroud)
或这个:
input [3:0] some_bus;
logic [2:0] count_ones;
always_comb begin
count_ones = '0;
for(int i=0; i<4; i++) begin
if(some_bus[i])
count_ones <= count_ones + 1;
end
end
Run Code Online (Sandbox Code Playgroud)
我确实看过1800-2012标准,但无法弄明白.一个答案指出标准中适当的部分将不胜感激.
在IntelliJ社区版中是否有插件或从右到左书写的简单方法?也许是开发人员正在使用的黑客攻击?我正在写一个希伯来语的android应用程序,并且编写资源文件真的很难.
我想复制带偏移的内存块,是否可能?
这是我到目前为止的代码:
const
SOURCE: array [0..5] of Byte = ($47, $49, $46, $38, $39, $61);
var
Destination: Pointer;
begin
// This is a full copy
Move(SOURCE, Destination^, SizeOf(SOURCE));
// If i want to copy from the third byte, is it possible?
// I imagine the code should be, but it cannot be compiled.
Move(Slice(SOURCE^, {Offset=}2)^, Destination^, SizeOf(SOURCE) - 2);
end;
Run Code Online (Sandbox Code Playgroud) 据我所知,以下代码正确地进行了合成和模拟,但XST仍然发出以下警告: value(s) does not match array range, simulation mismatch.是否有我遗漏的东西?
使用的工具:Xilinx ISE项目导航器(合成器:XST)FPGA:SPARTAN 3E
module error_example(
input [47:0] data,
input [2:0] sel,
output [5:0] data_out
);
assign data_out = data[sel*6 +: 6];
endmodule
Run Code Online (Sandbox Code Playgroud)
WARNING:Xst:790 - "error_example.v" line 8: Index value(s) does not match array range, simulation mismatch.
就像我说的,这是有效的,我已经完成了数学运算:
sel 可以有0到7之间的值,
if sel为0,那么data_out = data[5:0]
......
如果sel是7,那么data_out = data[47:42]
我应该在这里做些不同的事吗?这是XST中的错误吗?
我有一个数组,我想将其初始化为全部 1。为此,我使用了以下代码片段:
logic [15:0] memory [8];
always_ff @(posedge clk or posedge reset) begin
if(reset) begin
memory <= '{default:'1};
end
else begin
...
end
end
Run Code Online (Sandbox Code Playgroud)
我的模拟器做了我认为正确的事情并将寄存器设置为16'hFFFF复位。但是,我的 lint 工具给了我一个警告,即位 0 具有异步设置,而位 1 到 15 具有异步重置。这意味着 linter 认为此代码分配16'h0001给寄存器。
由于这两个工具来自同一供应商,我提交了一个错误报告,因为它们不可能都是正确的。
问题是:根据规范,哪种行为是正确的?没有示例可以显示这种确切情况。第 5.7.1 节提到:
可以通过在单个位值前面加上撇号 ( ' ) 来指定未调整大小的单个位值,但不使用基数说明符。未定大小值的所有位都应设置为指定位的值。在自定上下文中,未定大小的单个位值应具有 1 位的宽度,并且该值应被视为无符号。
'0, '1, 'X, 'x, 'Z, 'z // 将所有位设置为指定值
如果这是一个“自定上下文”,那么答案是将 1 位符号扩展到 16'h0001,但如果不是,那么我猜想“将所有位设置为指定值”的示例适用。我不确定这是否是一个自我确定的上下文。
我想将一些实数打印到日志文件中。为了使它们易于阅读,我希望它们都具有相同的宽度。我知道这些数字的范围从 0 到 4095.75,所以我试过这个:
$display("expected= %4.2f, actual= %4.2f", expected, actual)
Run Code Online (Sandbox Code Playgroud)
我希望看到的是这样的:
expected= 12.25, actual= 12.75
expected= 4093.25, actual= 4094.75
Run Code Online (Sandbox Code Playgroud)
但我得到的是这样的:
expected= 12.25, actual= 12.75
expected= 4093.25, actual= 4094.75
Run Code Online (Sandbox Code Playgroud)
如何强制小数点上方值的宽度为 4 个字符?第21.2.1.3节LRM显示数据的大小在 %f 上是静默的。
我尝试用我自己的版本即时替换Delphi内置函数.
function ShortCutToTextOverride(ShortCut: TShortCut): string;
begin
if SomeCondition then
Result := Menus.ShortCutToText // after patching the pointer equals ShortCutToTextOverride
else
begin
// My own code goes here
end;
end;
FastcodeAddressPatch(@Menus.ShortCutToText, @ShortCutToTextOverride);
Run Code Online (Sandbox Code Playgroud)
修补后,无法再访问原始功能.无论如何都可以访问它?