我有一个数组,我想将其初始化为全部 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,但如果不是,那么我猜想“将所有位设置为指定值”的示例适用。我不确定这是否是一个自我确定的上下文。
模拟器是正确的:memory <= '{default:'1};将所有的每一位都分配memory为 1。linting 工具确实有一个错误。请参阅IEEE Std 1800-2012 § 10.9.1数组分配模式:
- **default:***value* 适用于与索引或类型键都不匹配的元素或子数组。如果元素或子数组的类型是简单的位向量类型,与值的自定类型匹配,或者不是数组或结构类型,则在对元素或子数组的每次赋值的上下文中计算该值默认情况下,应可转换为元素或子数组的类型;否则会产生错误。...
该LRM超越什么是综合的,当涉及到分配模式。大多数工具仍然支持所有 SystemVerilog 功能。尝试确保您的工具(模拟器、合成器、lint 工具、逻辑等效性检查器等)都为您想要的功能提供必要的支持。