首页 > 解决方案 > 这些行在 Verilog 中是否合法?

问题描述

我正在研究Verilog 中 rs232 协议的 RTL 编码我在两个不同的文件中编写了 Tx/Rx 代码。

我想知道这些行[如下所示]在verilog中是否合法。合法我的意思是他们产生可合成的输出吗?我已将 count_tx 初始化为 12。基本上,我希望通过 dataframe_tx 进行串行输出。我知道我们可以通过逻辑左移来做到这一点,但我使用了这种方法。

在波形分析仪中,我可以看到 dataframe_tx 始终为零。这就是我开始怀疑这些台词的地方。

.
.
.
S_SENDING:begin
          dataframe_tx = temp_tx[12-count_tx];
          count_tx = count_tx - 1;

          if(count_tx)
          next_tx = S_SENDING;
          else begin
          next_tx = S_DONE;
          done_tx = 1'b1;
          end

          end
.
.
.
.

标签: verilogsystem-verilogtest-benchregister-transfer-level

解决方案


回答您的问题:您发布的代码片段由合法的 SystemVerilog 构造组成。

如果添加了您引用的对象的正确声明,添加了明显缺失的case语句并将整个语句包装在一个always_ff块中,它将编译并因此生成可合成的代码。你问的是语法而不是语义。它会起作用吗?从片段很难分辨。但是您声明的意图if似乎是检查向量是否非零。if( |count_tx )改为考虑。我在您的代码中添加了几行代码,以确保语法正常。我还可以自由地将分配更改为非阻塞,因为否则工具会推断出这些分配。仍然是一个片段,但我希望它可能会有所帮助。

module Sandbox(
    input logic clk
    // inputs and outputs ...
);
    logic           dataframe_tx;
    logic   [12:0]  temp_tx;
    logic               done_tx;
    logic   [3:0]       count_tx;

    enum    {S_SENDING, S_DONE} next_tx;

    always_ff @(posedge clk)        // as an example
    begin
        case (next_tx)
            // something ...
            S_SENDING: begin
                dataframe_tx    <= temp_tx[12-count_tx];
                count_tx        <= count_tx - 1;

                if( |count_tx )
                    next_tx <= S_SENDING;
                else begin
                    next_tx <= S_DONE;
                    done_tx <= 1'b1;
                end
            end
            // something ....
            S_DONE: /* your code */;
        endcase
    end
endmodule

祝你好运!


推荐阅读