【问题标题】:Verilog Assignment nth iterationVerilog 分配第 n 次迭代
【发布时间】:2014-06-10 04:25:03
【问题描述】:

我有以下代码:

always @ (clk) begin 
  for (1=0,i<150, i++) begin
    abc[i] = xyz[i];
  end
end

问题:如果我想获得 abc[8] 的值(使用 assign 语句进行第 8 次迭代的集合),我该怎么做?

我确实喜欢以下内容:

reg [31:0] abc;
wire [31:0] jkl;

always @ (clk) begin 
  for (1=0,i<150, i++) begin
    abc[i] = xyz[i];
  end
end 

assign jkl = abc[8];

$display ("value is 0x%x\n", jkl);

我有一个错误,你能给我一些建议吗?

【问题讨论】:

  • 您至少有两个语法错误或拼写错误:for (1=0 应该是i=0 吗?另请提供错误信息。
  • 抱歉我的错字:它的 i=0 而不是 1=0。错误是“期待关键字'endmodule'”。但是,我的代码中确实有 endmodule。如果我删除分配语句,则会出错。所以,我只需要如何将第 8 组迭代分配给临时变量,以便我可以检查临时值是否被覆盖。
  • 您应该编辑您的问题以修正错字。
  • 除了@dwikle 提出的点之外,您的意思可能是always @(posedge clk) 目前这些块将在时钟的两个边缘触发。

标签: verilog


【解决方案1】:

您似乎误解了 for 循环在 Verilog 中的工作方式。在 Verilog 中,您正在定义始终并行运行的硬件。 for 循环只是表达某些东西的便捷方式。您不应将其视为迭代。

你的表达的意思是这样的:

xyz[i]i 的所有值从0 到149 分配abc[i]在每个时钟周期

如果你真的想迭代,你需要创建一个在每个周期递增的计数器,并使用它来代替 for 循环。


现在,由于您的其他一些错误,您可能会收到错误消息:

  1. 您不能将$display 放在顺序代码块之外。也就是说,它需要位于 alwaysforever 块或类似块内。

  2. 您正在从abc[8] 分配jkl(32 位值),这是一个位

  3. 您在 for 循环中将 abc[0] 分配给 abc[149],但 abc 只有 32 位宽

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2014-08-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多