我有一个问题(由于缺乏理解),我在另一个文件中构建了一个模块,并希望让我的更高级别(不一定是顶层)模块通过提供输入来使用它,并获得输出模块。下面是简化形式的代码片段,用于说明我的问题。
module translate_packet_data(rx_packet, packet_size, do_analysis, output_ascii);
reg [7:0] gps_utc_hour;
reg [7:0] gps_utc_min;
reg [7:0] gps_utc_sec;
reg [31:0] gps_utc_milli;
wire [3:0] utc_hour_hundreds_w,utc_hour_tens_w,utc_hour_ones_w;
reg [3:0] utc_hour_hundreds,utc_hour_tens,utc_hour_ones;
binary8_to_BCD utc_hour_BCD(
.binary(gps_utc_hour),
.Hundreds(utc_hour_hundreds_w),
.Tens(utc_hour_tens_w),
.Ones(utc_hour_ones_w)
);
always @ (posedge do_analysis) begin
//Do all my logic stuff
gps_utc_hour = rx_packet[pointer-:8];
//more logic stuff, but thats besides the point
//Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
utc_hour_tens = utc_hour_tens_w;
utc_hour_tens = utc_hour_tens + 48;
reg_output_ascii = {reg_output_ascii, utc_hour_tens};
end
正如您可以从我的代码片段中看到的那样,utc_hour_tens_w尚未解决,我将从模拟中获得XXXX。所以我的问题是如果我想维护这个模块中的所有翻译逻辑,我该如何解决这个问题呢? (是的,我知道提供的代码不起作用,它是问题相关部分的粗略复制/粘贴工作,完整代码有大约600行,你们都不想看到)
目标主要是获取数据包,提取有意义的部分,将其转换为BCD,然后将其转换为ASCII并将其存储到输出到计算机的输出寄存器中。
答案 0 :(得分:2)
我认为您的敏感度列表是错误的。
always @ (posedge do_analysis) begin
//Do all my logic stuff
gps_utc_hour = rx_packet[pointer-:8];
//more logic stuff, but thats besides the point
//Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
utc_hour_tens = utc_hour_tens_w;
utc_hour_tens = utc_hour_tens + 48;
reg_output_ascii = {reg_output_ascii, utc_hour_tens};
end
如果这只是一个组合块(不是时钟序列逻辑),那么你应该只使用推断的灵敏度列表always @*
。这将确保utc_hour_tens_w包含在灵敏度中,并且您的输出将在utc_hour_tens_w
完成后立即更新。
如果你试图阻止输出在do_analysis
为低时改变,那么在块内部做一个if条件,不要试图通过弄乱灵敏度列表来控制组合逻辑。
答案 1 :(得分:0)
问题在于您尝试在单个顺序块中分配两次寄存器,第二次使用从自身派生的数据。您可以尝试使用utc_hour_tens = ...
utc_hour_tens <= utc_hour_tens+48
作业