在将参数用作条件时遇到问题
我在把一个 parameter 作为条件使用时遇到了问题。无论在模块实例化中使用的 DW 值是 16'hxxx 还是 32'hxxx,都出现了位宽不匹配。
我以为 DW 是一个只读参数,会在展开阶段被处理。我不太确定自己缺少了什么。我知道 generate 是一个备选方案,但这个例子来自一段相当长的代码(Verilog超过1,000行)。
我正在使用:
Test #(DW) Test
(
.Clock (Clock),
.Reset (Reset),
.Data (Data)
);
module Test
#(parameter DW = 1)
(
input wire Clock,
input wire Reset,
output reg [DW-1: 0] Data
);
always @(posedge Clock)
begin
if (DW == 16)
Data = 16'h0123;
else
Data = 32'h01234567;
end
endmodule
解决方案
以下是一个完整的代码示例,展示设置 DW 以避免位宽不匹配的一种常见做法:
module Test
#(parameter DW = 1)
(
input wire Clock,
input wire Reset,
output reg [DW-1: 0] Data
);
always @(posedge Clock)
begin
if (DW == 16)
Data = 16'h0123;
else
Data = 32'h01234567;
end
endmodule
module tb;
parameter DW = 32;
logic [DW-1:0] Data;
bit Clock, Reset;
Test #(DW) Test
(
.Clock (Clock),
.Reset (Reset),
.Data (Data)
);
always #5 Clock++;
initial begin
#12 $display($time, " Data='h%h", Data);
$finish;
end
endmodule
以下是输出:
12 Data='h01234567
这是在 EDA Playground 上演示的链接。
在顶层模块 (tb) 中,我们有:
- 对
DWparameter的声明,并将其设为一个数值常量 (32) - 使用
DWparameter对Data信号进行声明
在 tb 模块中使用这行代码将把它设置为另一种值:
parameter DW = 16;
备选方案
消除位宽不匹配消息的正确做法是使用显式强制转换。
always @(posedge Clock)
begin
if (DW == 16)
Data = DW'('h0123);
else
Data = DW'('h01234567);
end
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。